{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "charming-congress",
   "metadata": {},
   "outputs": [],
   "source": [
    "# for use in tutorial and development; do not include this `sys.path` change in production:\n",
    "import sys ; sys.path.insert(0, \"../\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cheap-karen",
   "metadata": {},
   "source": [
    "# Getting Started"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "extraordinary-barcelona",
   "metadata": {},
   "source": [
    "First, we'll import the required libraries and add the **PyTextRank** component into the `spaCy` pipeline:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "latest-upper",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pytextrank\n",
    "import spacy\n",
    "\n",
    "nlp = spacy.load(\"en_core_web_sm\")\n",
    "nlp.add_pipe(\"textrank\");"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "behind-execution",
   "metadata": {},
   "source": [
    "Let's take a look at this pipeline now..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "incorrect-recall",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['tok2vec',\n",
       " 'tagger',\n",
       " 'parser',\n",
       " 'attribute_ruler',\n",
       " 'lemmatizer',\n",
       " 'ner',\n",
       " 'textrank']"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nlp.pipe_names"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ready-driver",
   "metadata": {},
   "source": [
    "We can examine the `spaCy` pipeline in much greater detail..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "indie-mambo",
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[1m\n",
      "============================= Pipeline Overview =============================\u001b[0m\n",
      "\n",
      "#   Component         Assigns               Requires   Scores             Retokenizes\n",
      "-   ---------------   -------------------   --------   ----------------   -----------\n",
      "0   tok2vec           doc.tensor                                          False      \n",
      "                                                                                     \n",
      "1   tagger            token.tag                        tag_acc            False      \n",
      "                                                                                     \n",
      "2   parser            token.dep                        dep_uas            False      \n",
      "                      token.head                       dep_las                       \n",
      "                      token.is_sent_start              dep_las_per_type              \n",
      "                      doc.sents                        sents_p                       \n",
      "                                                       sents_r                       \n",
      "                                                       sents_f                       \n",
      "                                                                                     \n",
      "3   attribute_ruler                                                       False      \n",
      "                                                                                     \n",
      "4   lemmatizer        token.lemma                      lemma_acc          False      \n",
      "                                                                                     \n",
      "5   ner               doc.ents                         ents_f             False      \n",
      "                      token.ent_iob                    ents_p                        \n",
      "                      token.ent_type                   ents_r                        \n",
      "                                                       ents_per_type                 \n",
      "                                                                                     \n",
      "6   textrank                                                              False      \n",
      "\n",
      "\u001b[38;5;2m✔ No problems found.\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'summary': {'tok2vec': {'assigns': ['doc.tensor'],\n",
       "   'requires': [],\n",
       "   'scores': [],\n",
       "   'retokenizes': False},\n",
       "  'tagger': {'assigns': ['token.tag'],\n",
       "   'requires': [],\n",
       "   'scores': ['tag_acc'],\n",
       "   'retokenizes': False},\n",
       "  'parser': {'assigns': ['token.dep',\n",
       "    'token.head',\n",
       "    'token.is_sent_start',\n",
       "    'doc.sents'],\n",
       "   'requires': [],\n",
       "   'scores': ['dep_uas',\n",
       "    'dep_las',\n",
       "    'dep_las_per_type',\n",
       "    'sents_p',\n",
       "    'sents_r',\n",
       "    'sents_f'],\n",
       "   'retokenizes': False},\n",
       "  'attribute_ruler': {'assigns': [],\n",
       "   'requires': [],\n",
       "   'scores': [],\n",
       "   'retokenizes': False},\n",
       "  'lemmatizer': {'assigns': ['token.lemma'],\n",
       "   'requires': [],\n",
       "   'scores': ['lemma_acc'],\n",
       "   'retokenizes': False},\n",
       "  'ner': {'assigns': ['doc.ents', 'token.ent_iob', 'token.ent_type'],\n",
       "   'requires': [],\n",
       "   'scores': ['ents_f', 'ents_p', 'ents_r', 'ents_per_type'],\n",
       "   'retokenizes': False},\n",
       "  'textrank': {'assigns': [],\n",
       "   'requires': [],\n",
       "   'scores': [],\n",
       "   'retokenizes': False}},\n",
       " 'problems': {'tok2vec': [],\n",
       "  'tagger': [],\n",
       "  'parser': [],\n",
       "  'attribute_ruler': [],\n",
       "  'lemmatizer': [],\n",
       "  'ner': [],\n",
       "  'textrank': []},\n",
       " 'attrs': {'token.is_sent_start': {'assigns': ['parser'], 'requires': []},\n",
       "  'doc.sents': {'assigns': ['parser'], 'requires': []},\n",
       "  'token.head': {'assigns': ['parser'], 'requires': []},\n",
       "  'token.ent_iob': {'assigns': ['ner'], 'requires': []},\n",
       "  'token.tag': {'assigns': ['tagger'], 'requires': []},\n",
       "  'token.lemma': {'assigns': ['lemmatizer'], 'requires': []},\n",
       "  'doc.tensor': {'assigns': ['tok2vec'], 'requires': []},\n",
       "  'doc.ents': {'assigns': ['ner'], 'requires': []},\n",
       "  'token.dep': {'assigns': ['parser'], 'requires': []},\n",
       "  'token.ent_type': {'assigns': ['ner'], 'requires': []}}}"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nlp.analyze_pipes(pretty=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "perfect-student",
   "metadata": {},
   "source": [
    "Next, let's load some text from a document:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "formed-junior",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Compatibility of systems of linear constraints over the set of natural numbers. Criteria of compatibility of a system of linear Diophantine equations, strict inequations, and nonstrict inequations are considered. Upper bounds for components of a minimal set of solutions and algorithms of construction of minimal generating sets of solutions for all types of systems are given. These criteria and the corresponding algorithms for constructing a minimal supporting set of solutions can be used in solving all the considered types systems and systems of mixed types.\\n'"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from icecream import ic\n",
    "import pathlib\n",
    "\n",
    "text = pathlib.Path(\"../dat/mih.txt\").read_text()\n",
    "text"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "hollywood-lambda",
   "metadata": {},
   "source": [
    "Then run the `spaCy` pipeline..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "binary-means",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "92"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "doc = nlp(text)\n",
    "len(doc)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "patient-silicon",
   "metadata": {},
   "source": [
    "Now we can access the **PyTextRank** component within the `spaCy` pipeline, and use it to get more information for post-processing of the document.\n",
    "For example, let's see what the elapsed time in milliseconds was for the *TextRank* processing:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "adaptive-paper",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ic| tr.elapsed_time: 2.915620803833008\n"
     ]
    }
   ],
   "source": [
    "tr = doc._.textrank\n",
    "ic(tr.elapsed_time);"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "informational-traffic",
   "metadata": {},
   "source": [
    "Let's examine the top-ranked phrases in the document"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "passive-checkout",
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ic| phrase.rank: 0.18359439311764025\n",
      "    phrase.count: 1\n",
      "    phrase.text: 'mixed types'\n",
      "ic| phrase.chunks: [mixed types]\n",
      "ic| phrase.rank: 0.1784796193107821\n",
      "    phrase.count: 3\n",
      "    phrase.text: 'systems'\n",
      "ic| phrase.chunks: [systems, systems, systems]\n",
      "ic| phrase.rank: 0.15037838042245094\n",
      "    phrase.count: 1\n",
      "    phrase.text: 'minimal generating sets'\n",
      "ic| phrase.chunks: [minimal generating sets]\n",
      "ic| phrase.rank: 0.14740065982407313\n",
      "    phrase.count: 1\n",
      "    phrase.text: 'nonstrict inequations'\n",
      "ic| phrase.chunks: [nonstrict inequations]\n",
      "ic| phrase.rank: 0.13946027725597837\n",
      "    phrase.count: 1\n",
      "    phrase.text: 'strict inequations'\n",
      "ic| phrase.chunks: [strict inequations]\n",
      "ic| phrase.rank: 0.1195023546245721\n",
      "    phrase.count: 1\n",
      "    phrase.text: 'linear Diophantine equations'\n",
      "ic| phrase.chunks: [linear Diophantine equations]\n",
      "ic| phrase.rank: 0.11450088293222845\n",
      "    phrase.count: 1\n",
      "    phrase.text: 'natural numbers'\n",
      "ic| phrase.chunks: [natural numbers]\n",
      "ic| phrase.rank: 0.10780718173686318\n",
      "    phrase.count: 3\n",
      "    phrase.text: 'solutions'\n",
      "ic| phrase.chunks: [solutions, solutions, solutions]\n",
      "ic| phrase.rank: 0.10529828014583348\n",
      "    phrase.count: 1\n",
      "    phrase.text: 'linear constraints'\n",
      "ic| phrase.chunks: [linear constraints]\n",
      "ic| phrase.rank: 0.1036960590708142\n",
      "    phrase.count: 1\n",
      "    phrase.text: 'all the considered types systems'\n",
      "ic| phrase.chunks: [all the considered types systems]\n",
      "ic| phrase.rank: 0.08812713074893187\n",
      "    phrase.count: 1\n",
      "    phrase.text: 'a minimal supporting set'\n",
      "ic| phrase.chunks: [a minimal supporting set]\n",
      "ic| phrase.rank: 0.08444534702772151\n",
      "    phrase.count: 1\n",
      "    phrase.text: 'linear'\n",
      "ic| phrase.chunks: [linear]\n",
      "ic| phrase.rank: 0.08243620500315359\n",
      "    phrase.count: 1\n",
      "    phrase.text: 'a system'\n",
      "ic| phrase.chunks: [a system]\n",
      "ic| phrase.rank: 0.07944607954086784\n",
      "    phrase.count: 1\n",
      "    phrase.text: 'a minimal set'\n",
      "ic| phrase.chunks: [a minimal set]\n",
      "ic| phrase.rank: 0.0763527926213032\n",
      "    phrase.count: 1\n",
      "    phrase.text: 'algorithms'\n",
      "ic| phrase.chunks: [algorithms]\n",
      "ic| phrase.rank: 0.07593126037016427\n",
      "    phrase.count: 1\n",
      "    phrase.text: 'all types'\n",
      "ic| phrase.chunks: [all types]\n",
      "ic| phrase.rank: 0.07309361902551355\n",
      "    phrase.count: 1\n",
      "    phrase.text: 'Diophantine'\n",
      "ic| phrase.chunks: [Diophantine]\n",
      "ic| phrase.rank: 0.0702090100898443\n",
      "    phrase.count: 1\n",
      "    phrase.text: 'construction'\n",
      "ic| phrase.chunks: [construction]\n",
      "ic| phrase.rank: 0.05800111772673988\n",
      "    phrase.count: 1\n",
      "    phrase.text: 'the set'\n",
      "ic| phrase.chunks: [the set]\n",
      "ic| phrase.rank: 0.054251394765316464\n",
      "    phrase.count: 1\n",
      "    phrase.text: 'components'\n",
      "ic| phrase.chunks: [components]\n",
      "ic| phrase.rank: 0.04516904342912139\n",
      "    phrase.count: 1\n",
      "    phrase.text: 'Compatibility'\n",
      "ic| phrase.chunks: [Compatibility]\n",
      "ic| phrase.rank: 0.04516904342912139\n",
      "    phrase.count: 1\n",
      "    phrase.text: 'compatibility'\n",
      "ic| phrase.chunks: [compatibility]\n",
      "ic| phrase.rank: 0.04435648606848154\n",
      "    phrase.count: 1\n",
      "    phrase.text: 'the corresponding algorithms'\n",
      "ic| phrase.chunks: [the corresponding algorithms]\n",
      "ic| phrase.rank: 0.042273783712246285\n",
      "    phrase.count: 1\n",
      "    phrase.text: 'Criteria'\n",
      "ic| phrase.chunks: [Criteria]\n",
      "ic| phrase.rank: 0.01952542432474353\n",
      "    phrase.count: 1\n",
      "    phrase.text: 'These criteria'\n",
      "ic| phrase.chunks: [These criteria]\n"
     ]
    }
   ],
   "source": [
    "for phrase in doc._.phrases:\n",
    "    ic(phrase.rank, phrase.count, phrase.text)\n",
    "    ic(phrase.chunks)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "medium-vertex",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## Stop Words\n",
    "\n",
    "To show use of the *stop words* feature, first we'll output a baseline..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "separated-mambo",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ic| phrase: Phrase(text='words', chunks=[words, words], count=2, rank=0.16404428603296545)\n",
      "ic| phrase: Phrase(text='sentences', chunks=[sentences], count=1, rank=0.1287826954552565)\n",
      "ic| phrase: Phrase(text='Mihalcea et al',\n",
      "                   chunks=[Mihalcea et al],\n",
      "                   count=1,\n",
      "                   rank=0.11278365769540494)\n",
      "ic| phrase: Phrase(text='Barrios et al',\n",
      "                   chunks=[Barrios et al],\n",
      "                   count=1,\n",
      "                   rank=0.10760811592357011)\n",
      "ic| phrase: Phrase(text='the remaining words',\n",
      "                   chunks=[the remaining words],\n",
      "                   count=1,\n",
      "                   rank=0.09737893962520337)\n",
      "ic| phrase: Phrase(text='text summarization',\n",
      "                   chunks=[text summarization],\n",
      "                   count=1,\n",
      "                   rank=0.08861074217386355)\n",
      "ic| phrase: Phrase(text='ranking webpages',\n",
      "                   chunks=[ranking webpages],\n",
      "                   count=1,\n",
      "                   rank=0.07685260919250497)\n",
      "ic| phrase: Phrase(text='Okapi BM25 function',\n",
      "                   chunks=[Okapi BM25 function],\n",
      "                   count=1,\n",
      "                   rank=0.0756013984034083)\n",
      "ic| phrase: Phrase(text='gensim implements',\n",
      "                   chunks=[gensim implements],\n",
      "                   count=1,\n",
      "                   rank=0.0748386557231912)\n",
      "ic| phrase: Phrase(text='every other sentence',\n",
      "                   chunks=[every other sentence],\n",
      "                   count=1,\n",
      "                   rank=0.07031782290622991)\n"
     ]
    }
   ],
   "source": [
    "text = pathlib.Path(\"../dat/gen.txt\").read_text()\n",
    "doc = nlp(text)\n",
    "\n",
    "for phrase in doc._.phrases[:10]:\n",
    "    ic(phrase)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "narrative-nevada",
   "metadata": {},
   "source": [
    "Notice how the top-ranked phrase above is `words` ?\n",
    "Let's add that phrase to our *stop words* list, to exclude it from the ranked phrases..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "sacred-zealand",
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ic| phrase: Phrase(text='sentences', chunks=[sentences], count=1, rank=0.14407118792073048)\n",
      "ic| phrase: Phrase(text='Mihalcea et al',\n",
      "                   chunks=[Mihalcea et al],\n",
      "                   count=1,\n",
      "                   rank=0.12123026637064825)\n",
      "ic| phrase: Phrase(text='Barrios et al',\n",
      "                   chunks=[Barrios et al],\n",
      "                   count=1,\n",
      "                   rank=0.11566772028535821)\n",
      "ic| phrase: Phrase(text='text summarization',\n",
      "                   chunks=[text summarization],\n",
      "                   count=1,\n",
      "                   rank=0.09524776232834677)\n",
      "ic| phrase: Phrase(text='ranking webpages',\n",
      "                   chunks=[ranking webpages],\n",
      "                   count=1,\n",
      "                   rank=0.08260919223940909)\n",
      "ic| phrase: Phrase(text='Okapi BM25 function',\n",
      "                   chunks=[Okapi BM25 function],\n",
      "                   count=1,\n",
      "                   rank=0.08125840606728206)\n",
      "ic| phrase: Phrase(text='gensim implements',\n",
      "                   chunks=[gensim implements],\n",
      "                   count=1,\n",
      "                   rank=0.08043607214961235)\n",
      "ic| phrase: Phrase(text='every other sentence',\n",
      "                   chunks=[every other sentence],\n",
      "                   count=1,\n",
      "                   rank=0.07915141312258998)\n",
      "ic| phrase: Phrase(text='original TextRank',\n",
      "                   chunks=[original TextRank],\n",
      "                   count=1,\n",
      "                   rank=0.07013026654397199)\n",
      "ic| phrase: Phrase(text='TextRank',\n",
      "                   chunks=[TextRank, TextRank, TextRank, TextRank, TextRank],\n",
      "                   count=5,\n",
      "                   rank=0.06686718957926076)\n"
     ]
    }
   ],
   "source": [
    "nlp = spacy.load(\"en_core_web_sm\")\n",
    "nlp.add_pipe(\"textrank\", config={ \"stopwords\": { \"word\": [\"NOUN\"] } })\n",
    "\n",
    "doc = nlp(text)\n",
    "\n",
    "for phrase in doc._.phrases[:10]:\n",
    "    ic(phrase)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "experimental-scott",
   "metadata": {},
   "source": [
    "For each entry, you'll need to add a key that is the *lemma_* and a value that's a list of its *part-of-speech* tags.\n",
    "\n",
    "Note: [lemma_](https://spacy.io/api/token#attributes) of a token is base form of the token, with no inflectional suffixes. It is usually represented in lower-case form, with the exception of proper nouns and named entities. For eg. words like *ran*, *runs*, *running* will be lemmatized to *run*, *London* will be lemmatized to *London* without lower casing. It is sugggested to check the designated lemma value for a token before setting it in stopword config.      "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "chicken-kazakhstan",
   "metadata": {},
   "source": [
    "## Scrubber\n",
    "\n",
    "Observe how different variations of \"sentence\", like \"every sentence\" and \"every other sentence\", as well as variations of \"sentences\", occur in phrase list. You can omit such variations by passing a scrubber function in the config."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "living-cholesterol",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ic| phrase: Phrase(text='sentence',\n",
      "                   chunks=[sentences,\n",
      "                           every sentence,\n",
      "                           every other sentence,\n",
      "                           the two sentences,\n",
      "                           two sentences,\n",
      "                           the sentences],\n",
      "                   count=6,\n",
      "                   rank=0.14407118792073048)\n",
      "ic| phrase: Phrase(text='Mihalcea et al',\n",
      "                   chunks=[Mihalcea et al],\n",
      "                   count=1,\n",
      "                   rank=0.12123026637064825)\n",
      "ic| phrase: Phrase(text='Barrios et al',\n",
      "                   chunks=[Barrios et al],\n",
      "                   count=1,\n",
      "                   rank=0.11566772028535821)\n",
      "ic| phrase: Phrase(text='text summarization',\n",
      "                   chunks=[text summarization],\n",
      "                   count=1,\n",
      "                   rank=0.09524776232834677)\n",
      "ic| phrase: Phrase(text='rank webpage',\n",
      "                   chunks=[ranking webpages],\n",
      "                   count=1,\n",
      "                   rank=0.08260919223940909)\n",
      "ic| phrase: Phrase(text='Okapi BM25 function',\n",
      "                   chunks=[Okapi BM25 function],\n",
      "                   count=1,\n",
      "                   rank=0.08125840606728206)\n",
      "ic| phrase: Phrase(text='gensim implement',\n",
      "                   chunks=[gensim implements],\n",
      "                   count=1,\n",
      "                   rank=0.08043607214961235)\n",
      "ic| phrase: Phrase(text='original TextRank',\n",
      "                   chunks=[original TextRank],\n",
      "                   count=1,\n",
      "                   rank=0.07013026654397199)\n",
      "ic| phrase: Phrase(text='TextRank',\n",
      "                   chunks=[TextRank, TextRank, TextRank, TextRank],\n",
      "                   count=4,\n",
      "                   rank=0.06686718957926076)\n",
      "ic| phrase: Phrase(text='Olavur Mortensen',\n",
      "                   chunks=[Olavur Mortensen, Olavur Mortensen],\n",
      "                   count=2,\n",
      "                   rank=0.06548020385220721)\n"
     ]
    }
   ],
   "source": [
    "from spacy.tokens import Span\n",
    "nlp = spacy.load(\"en_core_web_sm\")\n",
    "\n",
    "\n",
    "@spacy.registry.misc(\"prefix_scrubber\")\n",
    "def prefix_scrubber():\n",
    "\tdef scrubber_func(span: Span) -> str:\n",
    "\t\twhile len(span) > 1 and span[0].text in (\"a\", \"the\", \"their\", \"every\", \"other\", \"two\"):\n",
    "\t\t\tspan = span[1:]\n",
    "\t\treturn span.lemma_\n",
    "\treturn scrubber_func\n",
    "\n",
    "nlp.add_pipe(\"textrank\", config={ \"stopwords\": { \"word\": [\"NOUN\"] }, \"scrubber\": {\"@misc\": \"prefix_scrubber\"}})\n",
    "\n",
    "doc = nlp(text)\n",
    "\n",
    "for phrase in doc._.phrases[:10]:\n",
    "    ic(phrase)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "precious-processing",
   "metadata": {},
   "source": [
    "Different variations of \"sentence(s)\" are now represented as part of single entry in phrase list."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a123e0fa-c594-4b8c-9ca3-4d3205c2662a",
   "metadata": {},
   "source": [
    "As the scrubber takes in `Spans`, we can also use `token.pos_` or any other spaCy `Token` or `Span` attribute in the scrubbing. The variations of \"sentences\" have different DETs (determiners), so we could achieve a similar result with the folowing scrubber."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "49bc498c-8bbe-4c41-8619-35f8f74ef608",
   "metadata": {},
   "outputs": [],
   "source": [
    "@spacy.registry.misc(\"articles_scrubber\")\n",
    "def articles_scrubber():\n",
    "    def scrubber_func(span: Span) -> str:\n",
    "        for token in span:\n",
    "            if token.pos_ not in [\"DET\", \"PRON\"]:\n",
    "                break\n",
    "            span = span[1:]\n",
    "        return span.text\n",
    "    return scrubber_func"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "7535d038-0cb1-4bb3-90df-9b5a87e32b94",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ic| phrase: Phrase(text='sentences',\n",
      "                   chunks=[sentences, the sentences],\n",
      "                   count=2,\n",
      "                   rank=0.14407118792073048)\n",
      "ic| phrase: Phrase(text='Mihalcea et al',\n",
      "                   chunks=[Mihalcea et al],\n",
      "                   count=1,\n",
      "                   rank=0.12123026637064825)\n",
      "ic| phrase: Phrase(text='Barrios et al',\n",
      "                   chunks=[Barrios et al],\n",
      "                   count=1,\n",
      "                   rank=0.11566772028535821)\n",
      "ic| phrase: Phrase(text='text summarization',\n",
      "                   chunks=[text summarization],\n",
      "                   count=1,\n",
      "                   rank=0.09524776232834677)\n",
      "ic| phrase: Phrase(text='ranking webpages',\n",
      "                   chunks=[ranking webpages],\n",
      "                   count=1,\n",
      "                   rank=0.08260919223940909)\n",
      "ic| phrase: Phrase(text='Okapi BM25 function',\n",
      "                   chunks=[Okapi BM25 function],\n",
      "                   count=1,\n",
      "                   rank=0.08125840606728206)\n",
      "ic| phrase: Phrase(text='gensim implements',\n",
      "                   chunks=[gensim implements],\n",
      "                   count=1,\n",
      "                   rank=0.08043607214961235)\n",
      "ic| phrase: Phrase(text='other sentence',\n",
      "                   chunks=[every other sentence],\n",
      "                   count=1,\n",
      "                   rank=0.07915141312258998)\n",
      "ic| phrase: Phrase(text='original TextRank',\n",
      "                   chunks=[original TextRank],\n",
      "                   count=1,\n",
      "                   rank=0.07013026654397199)\n",
      "ic| phrase: Phrase(text='TextRank',\n",
      "                   chunks=[TextRank, TextRank, TextRank, TextRank, TextRank],\n",
      "                   count=5,\n",
      "                   rank=0.06686718957926076)\n"
     ]
    }
   ],
   "source": [
    "nlp = spacy.load(\"en_core_web_sm\")\n",
    "nlp.add_pipe(\"textrank\", config={ \"stopwords\": { \"word\": [\"NOUN\"] }, \"scrubber\": {\"@misc\": \"articles_scrubber\"}})\n",
    "\n",
    "doc = nlp(text)\n",
    "\n",
    "for phrase in doc._.phrases[:10]:\n",
    "    ic(phrase)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ab4a344f-9426-43df-9171-18d45a0ab0fb",
   "metadata": {},
   "source": [
    "We could also use `Span` labels to filter out `ents`, for example, or certain types of entities, e.g. \"CARDINAL\", or \"DATE\", if need to do so for our use case."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "9bd7988f-d742-4065-9b8f-8870ca09f007",
   "metadata": {},
   "outputs": [],
   "source": [
    "@spacy.registry.misc(\"entity_scrubber\")\n",
    "def articles_scrubber():\n",
    "    def scrubber_func(span: Span) -> str:\n",
    "        if span[0].ent_type_:\n",
    "            # ignore named entities\n",
    "            return \"INELIGIBLE_PHRASE\"\n",
    "        return span.text\n",
    "    return scrubber_func"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "8af03b4c-77f3-4d1a-883f-ce880d202e86",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ic| phrase: Phrase(text='sentences', chunks=[sentences], count=1, rank=0.14407118792073048)\n",
      "ic| phrase: Phrase(text='Barrios et al',\n",
      "                   chunks=[Barrios et al],\n",
      "                   count=1,\n",
      "                   rank=0.11566772028535821)\n",
      "ic| phrase: Phrase(text='text summarization',\n",
      "                   chunks=[text summarization],\n",
      "                   count=1,\n",
      "                   rank=0.09524776232834677)\n",
      "ic| phrase: Phrase(text='ranking webpages',\n",
      "                   chunks=[ranking webpages],\n",
      "                   count=1,\n",
      "                   rank=0.08260919223940909)\n",
      "ic| phrase: Phrase(text='gensim implements',\n",
      "                   chunks=[gensim implements],\n",
      "                   count=1,\n",
      "                   rank=0.08043607214961235)\n",
      "ic| phrase: Phrase(text='every other sentence',\n",
      "                   chunks=[every other sentence],\n",
      "                   count=1,\n",
      "                   rank=0.07915141312258998)\n",
      "ic| phrase: Phrase(text='original TextRank',\n",
      "                   chunks=[original TextRank],\n",
      "                   count=1,\n",
      "                   rank=0.07013026654397199)\n",
      "ic| phrase: Phrase(text='every sentence',\n",
      "                   chunks=[every sentence],\n",
      "                   count=1,\n",
      "                   rank=0.06654363130280233)\n",
      "ic| phrase: Phrase(text='the sentences',\n",
      "                   chunks=[the sentences],\n",
      "                   count=1,\n",
      "                   rank=0.06654363130280233)\n"
     ]
    }
   ],
   "source": [
    "nlp = spacy.load(\"en_core_web_sm\")\n",
    "nlp.add_pipe(\"textrank\", config={ \"stopwords\": { \"word\": [\"NOUN\"] }, \"scrubber\": {\"@misc\": \"entity_scrubber\"}})\n",
    "\n",
    "doc = nlp(text)\n",
    "\n",
    "for phrase in doc._.phrases[:10]:\n",
    "    if phrase.text != \"INELIGIBLE_PHRASE\":\n",
    "        ic(phrase)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "forced-motion",
   "metadata": {},
   "source": [
    "## GraphViz Export\n",
    "\n",
    "Let's generate a GraphViz doc `lemma_graph.dot` to visualize the *lemma graph* that **PyTextRank** produced for the most recent document..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "peripheral-reply",
   "metadata": {},
   "outputs": [],
   "source": [
    "tr = doc._.textrank\n",
    "tr.write_dot(path=\"lemma_graph.dot\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "classical-fairy",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-rw-rw-r-- 1 ankush ankush 18K Aug  9 15:06 lemma_graph.dot\n"
     ]
    }
   ],
   "source": [
    "!ls -lth lemma_graph.dot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "needed-termination",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Requirement already satisfied: graphviz in /home/ankush/workplace/os_repos/pytextrank/venv/lib/python3.10/site-packages (0.20.1)\n",
      "\n",
      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip available: \u001b[0m\u001b[31;49m22.3.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m23.2.1\u001b[0m\n",
      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n"
     ]
    }
   ],
   "source": [
    "!pip install graphviz"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "substantial-feature",
   "metadata": {},
   "source": [
    "To render this graph, you must first download `GraphViz` <https://www.graphviz.org/download/>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "residential-upper",
   "metadata": {},
   "source": [
    "Then you can render a `DOT` file..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "female-connecticut",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<!-- Generated by graphviz version 2.43.0 (0)\n",
       " -->\n",
       "<!-- Title: %3 Pages: 1 -->\n",
       "<svg width=\"20083pt\" height=\"80pt\"\n",
       " viewBox=\"0.00 0.00 20082.58 79.95\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 75.95)\">\n",
       "<title>%3</title>\n",
       "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-75.95 20078.58,-75.95 20078.58,4 -4,4\"/>\n",
       "<!-- (&#39;quick&#39;, &#39;ADJ&#39;) -->\n",
       "<g id=\"node1\" class=\"node\">\n",
       "<title>(&#39;quick&#39;, &#39;ADJ&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"116.99\" cy=\"-18\" rx=\"116.98\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"116.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;quick&#39;, &#39;ADJ&#39;) (0.0042)</text>\n",
       "</g>\n",
       "<!-- (&#39;description&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node2\" class=\"node\">\n",
       "<title>(&#39;description&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"409.99\" cy=\"-18\" rx=\"157.87\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"409.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;description&#39;, &#39;NOUN&#39;) (0.0055)</text>\n",
       "</g>\n",
       "<!-- (&#39;quick&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;description&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge1\" class=\"edge\">\n",
       "<title>(&#39;quick&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;description&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M234.02,-18C236.62,-18 239.23,-18 241.84,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"241.89,-21.5 251.89,-18 241.89,-14.5 241.89,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;popular&#39;, &#39;ADJ&#39;) -->\n",
       "<g id=\"node3\" class=\"node\">\n",
       "<title>(&#39;popular&#39;, &#39;ADJ&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"713.99\" cy=\"-18\" rx=\"128.08\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"713.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;popular&#39;, &#39;ADJ&#39;) (0.0097)</text>\n",
       "</g>\n",
       "<!-- (&#39;quick&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;popular&#39;, &#39;ADJ&#39;) -->\n",
       "<g id=\"edge2\" class=\"edge\">\n",
       "<title>(&#39;quick&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;popular&#39;, &#39;ADJ&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M166.06,-34.39C191.4,-42 223.01,-50.2 251.99,-54 391.24,-72.25 428.57,-70.94 567.99,-54 595.56,-50.65 625.43,-43.87 650.92,-37.09\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"652.1,-40.39 660.83,-34.39 650.26,-33.64 652.1,-40.39\"/>\n",
       "</g>\n",
       "<!-- (&#39;algorithm&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node4\" class=\"node\">\n",
       "<title>(&#39;algorithm&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"1010.99\" cy=\"-18\" rx=\"151.37\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"1010.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;algorithm&#39;, &#39;NOUN&#39;) (0.0135)</text>\n",
       "</g>\n",
       "<!-- (&#39;quick&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;algorithm&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge3\" class=\"edge\">\n",
       "<title>(&#39;quick&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;algorithm&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M166.06,-34.39C191.4,-42 223.01,-50.2 251.99,-54 381.99,-71.04 711.6,-67.73 841.99,-54 874.15,-50.61 909.2,-43.69 939,-36.82\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"939.96,-40.19 948.89,-34.49 938.35,-33.37 939.96,-40.19\"/>\n",
       "</g>\n",
       "<!-- (&#39;description&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;popular&#39;, &#39;ADJ&#39;) -->\n",
       "<g id=\"edge4\" class=\"edge\">\n",
       "<title>(&#39;description&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;popular&#39;, &#39;ADJ&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M567.93,-18C570.55,-18 573.17,-18 575.79,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"575.9,-21.5 585.9,-18 575.9,-14.5 575.9,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;description&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;algorithm&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge5\" class=\"edge\">\n",
       "<title>(&#39;description&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;algorithm&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M474.7,-34.49C507.75,-42.09 548.75,-50.23 585.99,-54 699.19,-65.46 728.84,-65.92 841.99,-54 874.15,-50.61 909.2,-43.69 939,-36.82\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"939.96,-40.19 948.89,-34.49 938.35,-33.37 939.96,-40.19\"/>\n",
       "</g>\n",
       "<!-- (&#39;implementation&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node5\" class=\"node\">\n",
       "<title>(&#39;implementation&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"1358.99\" cy=\"-18\" rx=\"178.97\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"1358.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;implementation&#39;, &#39;NOUN&#39;) (0.0091)</text>\n",
       "</g>\n",
       "<!-- (&#39;description&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;implementation&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge6\" class=\"edge\">\n",
       "<title>(&#39;description&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;implementation&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M474.7,-34.49C507.75,-42.09 548.75,-50.23 585.99,-54 713.34,-66.89 1034.51,-65.55 1161.99,-54 1199.81,-50.57 1241.21,-43.52 1276.26,-36.55\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"1277.34,-39.91 1286.45,-34.5 1275.95,-33.05 1277.34,-39.91\"/>\n",
       "</g>\n",
       "<!-- (&#39;popular&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;algorithm&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge7\" class=\"edge\">\n",
       "<title>(&#39;popular&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;algorithm&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M842.19,-18C844.51,-18 846.83,-18 849.15,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"849.33,-21.5 859.33,-18 849.33,-14.5 849.33,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;popular&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;implementation&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge8\" class=\"edge\">\n",
       "<title>(&#39;popular&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;implementation&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M767.15,-34.39C794.58,-42.01 828.76,-50.21 859.99,-54 993.23,-70.18 1028.32,-66.11 1161.99,-54 1199.81,-50.57 1241.21,-43.52 1276.26,-36.55\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"1277.34,-39.91 1286.45,-34.5 1275.95,-33.05 1277.34,-39.91\"/>\n",
       "</g>\n",
       "<!-- (&#39;text&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node6\" class=\"node\">\n",
       "<title>(&#39;text&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"1679.99\" cy=\"-18\" rx=\"124.28\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"1679.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;text&#39;, &#39;NOUN&#39;) (0.0189)</text>\n",
       "</g>\n",
       "<!-- (&#39;popular&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;text&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge9\" class=\"edge\">\n",
       "<title>(&#39;popular&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;text&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M767.15,-34.39C794.58,-42.01 828.76,-50.21 859.99,-54 1009.56,-72.17 1388.48,-72.66 1537.99,-54 1564.84,-50.65 1593.89,-43.87 1618.68,-37.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"1619.63,-40.45 1628.32,-34.39 1617.74,-33.71 1619.63,-40.45\"/>\n",
       "</g>\n",
       "<!-- (&#39;PageRank&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"node34\" class=\"node\">\n",
       "<title>(&#39;PageRank&#39;, &#39;PROPN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"13446.99\" cy=\"-18\" rx=\"155.17\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"13446.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;PageRank&#39;, &#39;PROPN&#39;) (0.0153)</text>\n",
       "</g>\n",
       "<!-- (&#39;popular&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;PageRank&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge10\" class=\"edge\">\n",
       "<title>(&#39;popular&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;PageRank&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M767.15,-34.39C794.58,-42.01 828.76,-50.21 859.99,-54 1031.15,-74.79 13102.48,-71.66 13273.99,-54 13306.89,-50.61 13342.76,-43.69 13373.27,-36.82\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"13374.43,-40.14 13383.4,-34.49 13372.87,-33.32 13374.43,-40.14\"/>\n",
       "</g>\n",
       "<!-- (&#39;Google&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"node35\" class=\"node\">\n",
       "<title>(&#39;Google&#39;, &#39;PROPN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"13131.99\" cy=\"-18\" rx=\"141.88\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"13131.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;Google&#39;, &#39;PROPN&#39;) (0.0097)</text>\n",
       "</g>\n",
       "<!-- (&#39;popular&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;Google&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge11\" class=\"edge\">\n",
       "<title>(&#39;popular&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;Google&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M767.15,-34.39C794.58,-42.01 828.76,-50.21 859.99,-54 1027,-74.29 12805.8,-72.69 12972.99,-54 13003.05,-50.64 13035.72,-43.81 13063.59,-36.99\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"13064.77,-40.31 13073.62,-34.49 13063.07,-33.52 13064.77,-40.31\"/>\n",
       "</g>\n",
       "<!-- (&#39;algorithm&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;implementation&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge12\" class=\"edge\">\n",
       "<title>(&#39;algorithm&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;implementation&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1162.56,-18C1165.04,-18 1167.52,-18 1170.01,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"1170.21,-21.5 1180.21,-18 1170.21,-14.5 1170.21,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;algorithm&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;text&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge13\" class=\"edge\">\n",
       "<title>(&#39;algorithm&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;text&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1073.09,-34.49C1104.82,-42.08 1144.19,-50.23 1179.99,-54 1338.23,-70.67 1380.1,-73.7 1537.99,-54 1564.84,-50.65 1593.89,-43.87 1618.68,-37.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"1619.63,-40.45 1628.32,-34.39 1617.74,-33.71 1619.63,-40.45\"/>\n",
       "</g>\n",
       "<!-- (&#39;summarization&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node7\" class=\"node\">\n",
       "<title>(&#39;summarization&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"1996.99\" cy=\"-18\" rx=\"174.67\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"1996.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;summarization&#39;, &#39;NOUN&#39;) (0.0219)</text>\n",
       "</g>\n",
       "<!-- (&#39;algorithm&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;summarization&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge14\" class=\"edge\">\n",
       "<title>(&#39;algorithm&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;summarization&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1073.09,-34.49C1104.82,-42.08 1144.19,-50.23 1179.99,-54 1317.89,-68.53 1665.91,-66.77 1803.99,-54 1841.06,-50.57 1881.63,-43.52 1915.96,-36.55\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"1916.85,-39.94 1925.94,-34.5 1915.44,-33.09 1916.85,-39.94\"/>\n",
       "</g>\n",
       "<!-- (&#39;algorithm&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;Google&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge15\" class=\"edge\">\n",
       "<title>(&#39;algorithm&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;Google&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1073.09,-34.49C1104.82,-42.08 1144.19,-50.23 1179.99,-54 1342.88,-71.16 12810.21,-72.2 12972.99,-54 13003.05,-50.64 13035.72,-43.81 13063.59,-36.99\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"13064.77,-40.31 13073.62,-34.49 13063.07,-33.52 13064.77,-40.31\"/>\n",
       "</g>\n",
       "<!-- (&#39;use&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"node36\" class=\"node\">\n",
       "<title>(&#39;use&#39;, &#39;VERB&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"12277.99\" cy=\"-18\" rx=\"118.08\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"12277.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;use&#39;, &#39;VERB&#39;) (0.0149)</text>\n",
       "</g>\n",
       "<!-- (&#39;algorithm&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;use&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge16\" class=\"edge\">\n",
       "<title>(&#39;algorithm&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;use&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1073.09,-34.49C1104.82,-42.08 1144.19,-50.23 1179.99,-54 1331.4,-69.95 11991.01,-73.64 12141.99,-54 12167.53,-50.68 12195.1,-43.98 12218.7,-37.26\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"12219.93,-40.55 12228.55,-34.39 12217.97,-33.83 12219.93,-40.55\"/>\n",
       "</g>\n",
       "<!-- (&#39;rank&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"node37\" class=\"node\">\n",
       "<title>(&#39;rank&#39;, &#39;VERB&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"12536.99\" cy=\"-18\" rx=\"122.68\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"12536.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;rank&#39;, &#39;VERB&#39;) (0.0114)</text>\n",
       "</g>\n",
       "<!-- (&#39;algorithm&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;rank&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge17\" class=\"edge\">\n",
       "<title>(&#39;algorithm&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;rank&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1073.09,-34.49C1104.82,-42.08 1144.19,-50.23 1179.99,-54 1334.91,-70.32 12241.43,-73.42 12395.99,-54 12422.54,-50.66 12451.25,-43.93 12475.8,-37.17\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"12477.01,-40.47 12485.69,-34.39 12475.11,-33.73 12477.01,-40.47\"/>\n",
       "</g>\n",
       "<!-- (&#39;implementation&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;text&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge18\" class=\"edge\">\n",
       "<title>(&#39;implementation&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;text&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1537.98,-18C1540.48,-18 1542.98,-18 1545.47,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"1545.74,-21.5 1555.74,-18 1545.74,-14.5 1545.74,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;implementation&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;summarization&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge19\" class=\"edge\">\n",
       "<title>(&#39;implementation&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;summarization&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1431.53,-34.5C1468.56,-42.09 1514.44,-50.23 1555.99,-54 1665.76,-63.95 1694.24,-64.15 1803.99,-54 1841.06,-50.57 1881.63,-43.52 1915.96,-36.55\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"1916.85,-39.94 1925.94,-34.5 1915.44,-33.09 1916.85,-39.94\"/>\n",
       "</g>\n",
       "<!-- (&#39;exist&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"node8\" class=\"node\">\n",
       "<title>(&#39;exist&#39;, &#39;VERB&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"2331.99\" cy=\"-18\" rx=\"124.28\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"2331.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;exist&#39;, &#39;VERB&#39;) (0.0126)</text>\n",
       "</g>\n",
       "<!-- (&#39;implementation&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;exist&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge20\" class=\"edge\">\n",
       "<title>(&#39;implementation&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;exist&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1431.53,-34.5C1468.56,-42.09 1514.44,-50.23 1555.99,-54 1696.3,-66.72 2050.19,-71.45 2189.99,-54 2216.84,-50.65 2245.89,-43.87 2270.68,-37.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"2271.63,-40.45 2280.32,-34.39 2269.74,-33.71 2271.63,-40.45\"/>\n",
       "</g>\n",
       "<!-- (&#39;text&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;summarization&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge21\" class=\"edge\">\n",
       "<title>(&#39;text&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;summarization&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1804.44,-18C1806.92,-18 1809.41,-18 1811.89,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"1812.11,-21.5 1822.11,-18 1812.11,-14.5 1812.11,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;text&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;exist&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge22\" class=\"edge\">\n",
       "<title>(&#39;text&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;exist&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1731.66,-34.39C1758.34,-42.01 1791.58,-50.21 1821.99,-54 1984.29,-74.25 2027.69,-74.25 2189.99,-54 2216.84,-50.65 2245.89,-43.87 2270.68,-37.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"2271.63,-40.45 2280.32,-34.39 2269.74,-33.71 2271.63,-40.45\"/>\n",
       "</g>\n",
       "<!-- (&#39;today&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node9\" class=\"node\">\n",
       "<title>(&#39;today&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"2605.99\" cy=\"-18\" rx=\"131.88\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"2605.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;today&#39;, &#39;NOUN&#39;) (0.0136)</text>\n",
       "</g>\n",
       "<!-- (&#39;text&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;today&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge23\" class=\"edge\">\n",
       "<title>(&#39;text&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;today&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1731.66,-34.39C1758.34,-42.01 1791.58,-50.21 1821.99,-54 1961.79,-71.45 2316.08,-70.55 2455.99,-54 2484.41,-50.64 2515.23,-43.81 2541.51,-37\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"2542.57,-40.34 2551.34,-34.39 2540.78,-33.57 2542.57,-40.34\"/>\n",
       "</g>\n",
       "<!-- (&#39;remove&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"node45\" class=\"node\">\n",
       "<title>(&#39;remove&#39;, &#39;VERB&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"17475.99\" cy=\"-18\" rx=\"136.48\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"17475.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;remove&#39;, &#39;VERB&#39;) (0.0132)</text>\n",
       "</g>\n",
       "<!-- (&#39;text&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;remove&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge24\" class=\"edge\">\n",
       "<title>(&#39;text&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;remove&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1731.66,-34.39C1758.34,-42.01 1791.58,-50.21 1821.99,-54 1928.79,-67.33 17214.06,-66.25 17320.99,-54 17350.45,-50.62 17382.44,-43.75 17409.68,-36.91\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"17410.66,-40.27 17419.48,-34.39 17408.93,-33.49 17410.66,-40.27\"/>\n",
       "</g>\n",
       "<!-- (&#39;stop&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"node46\" class=\"node\">\n",
       "<title>(&#39;stop&#39;, &#39;VERB&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"17752.99\" cy=\"-18\" rx=\"122.38\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"17752.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;stop&#39;, &#39;VERB&#39;) (0.0140)</text>\n",
       "</g>\n",
       "<!-- (&#39;text&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;stop&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge25\" class=\"edge\">\n",
       "<title>(&#39;text&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;stop&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1731.66,-34.39C1758.34,-42.01 1791.58,-50.21 1821.99,-54 1930.8,-67.58 17503.19,-67.67 17611.99,-54 17638.54,-50.66 17667.25,-43.93 17691.8,-37.17\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"17693.01,-40.47 17701.69,-34.39 17691.11,-33.73 17693.01,-40.47\"/>\n",
       "</g>\n",
       "<!-- (&#39;stem&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"node47\" class=\"node\">\n",
       "<title>(&#39;stem&#39;, &#39;VERB&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"18017.99\" cy=\"-18\" rx=\"124.58\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"18017.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;stem&#39;, &#39;VERB&#39;) (0.0166)</text>\n",
       "</g>\n",
       "<!-- (&#39;text&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;stem&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge26\" class=\"edge\">\n",
       "<title>(&#39;text&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;stem&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M1731.66,-34.39C1758.34,-42.01 1791.58,-50.21 1821.99,-54 1932.61,-67.8 17764.36,-67.71 17874.99,-54 17902.02,-50.65 17931.27,-43.87 17956.24,-37.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"17957.24,-40.44 17965.94,-34.39 17955.37,-33.69 17957.24,-40.44\"/>\n",
       "</g>\n",
       "<!-- (&#39;summarization&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;summarization&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge31\" class=\"edge\">\n",
       "<title>(&#39;summarization&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;summarization&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M2163.61,-23.46C2179.66,-22.35 2189.82,-20.53 2189.82,-18 2189.82,-16.06 2183.86,-14.54 2173.87,-13.44\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"2173.87,-9.93 2163.61,-12.54 2173.26,-16.9 2173.87,-9.93\"/>\n",
       "</g>\n",
       "<!-- (&#39;summarization&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;exist&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge27\" class=\"edge\">\n",
       "<title>(&#39;summarization&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;exist&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M2121.96,-5.37C2156.06,-3.97 2190.16,-4.26 2224.26,-6.22\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"2224.16,-9.72 2234.36,-6.85 2224.6,-2.73 2224.16,-9.72\"/>\n",
       "</g>\n",
       "<!-- (&#39;summarization&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;today&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge29\" class=\"edge\">\n",
       "<title>(&#39;summarization&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;today&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M2085.25,-33.58C2122.13,-39.35 2165.51,-45.17 2204.99,-48 2317.59,-56.08 2346.67,-59.34 2458.99,-48 2483.25,-45.55 2509.43,-40.88 2532.88,-35.94\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"2533.71,-39.34 2542.74,-33.81 2532.23,-32.5 2533.71,-39.34\"/>\n",
       "</g>\n",
       "<!-- (&#39;module&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node10\" class=\"node\">\n",
       "<title>(&#39;module&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"2895.99\" cy=\"-18\" rx=\"139.98\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"2895.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;module&#39;, &#39;NOUN&#39;) (0.0148)</text>\n",
       "</g>\n",
       "<!-- (&#39;summarization&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;module&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge28\" class=\"edge\">\n",
       "<title>(&#39;summarization&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;module&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M2073.26,-34.21C2113.19,-41.89 2163,-50.19 2207.99,-54 2442.7,-73.88 2503.91,-80.33 2737.99,-54 2767.87,-50.64 2800.34,-43.81 2828.03,-36.99\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"2829.15,-40.32 2838,-34.49 2827.45,-33.53 2829.15,-40.32\"/>\n",
       "</g>\n",
       "<!-- (&#39;gensim&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node11\" class=\"node\">\n",
       "<title>(&#39;gensim&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"3192.99\" cy=\"-18\" rx=\"139.98\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"3192.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;gensim&#39;, &#39;NOUN&#39;) (0.0154)</text>\n",
       "</g>\n",
       "<!-- (&#39;summarization&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;gensim&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge30\" class=\"edge\">\n",
       "<title>(&#39;summarization&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;gensim&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M2073.26,-34.21C2113.19,-41.89 2163,-50.19 2207.99,-54 2391.33,-69.53 2853.16,-74.69 3035.99,-54 3065.69,-50.64 3097.95,-43.81 3125.46,-36.99\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"3126.53,-40.33 3135.37,-34.49 3124.82,-33.55 3126.53,-40.33\"/>\n",
       "</g>\n",
       "<!-- (&#39;implement&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node12\" class=\"node\">\n",
       "<title>(&#39;implement&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"3505.99\" cy=\"-18\" rx=\"155.17\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"3505.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;implement&#39;, &#39;NOUN&#39;) (0.0137)</text>\n",
       "</g>\n",
       "<!-- (&#39;summarization&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;implement&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge32\" class=\"edge\">\n",
       "<title>(&#39;summarization&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;implement&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M2073.26,-34.21C2113.19,-41.89 2163,-50.19 2207.99,-54 2457.1,-75.1 3084.3,-79.6 3332.99,-54 3365.89,-50.61 3401.76,-43.69 3432.27,-36.82\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"3433.43,-40.14 3442.4,-34.49 3431.87,-33.32 3433.43,-40.14\"/>\n",
       "</g>\n",
       "<!-- (&#39;exist&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;summarization&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge34\" class=\"edge\">\n",
       "<title>(&#39;exist&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;summarization&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M2234.36,-29.15C2200.26,-31.44 2166.16,-32.06 2132.06,-30.99\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"2132.08,-27.49 2121.96,-30.63 2131.83,-34.49 2132.08,-27.49\"/>\n",
       "</g>\n",
       "<!-- (&#39;exist&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;today&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge33\" class=\"edge\">\n",
       "<title>(&#39;exist&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;today&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M2456.15,-18C2458.75,-18 2461.35,-18 2463.96,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"2464,-21.5 2474,-18 2464,-14.5 2464,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;exist&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;module&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge35\" class=\"edge\">\n",
       "<title>(&#39;exist&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;module&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M2383.66,-34.39C2410.34,-42.01 2443.58,-50.21 2473.99,-54 2590.42,-68.53 2621.39,-67.12 2737.99,-54 2767.87,-50.64 2800.34,-43.81 2828.03,-36.99\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"2829.15,-40.32 2838,-34.49 2827.45,-33.53 2829.15,-40.32\"/>\n",
       "</g>\n",
       "<!-- (&#39;today&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;summarization&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge36\" class=\"edge\">\n",
       "<title>(&#39;today&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;summarization&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M2557.76,-34.81C2527.98,-44.3 2488.75,-55.18 2452.99,-60 2346.4,-74.36 2318.04,-70.41 2210.99,-60 2165.21,-55.55 2114.69,-45.87 2074.23,-36.92\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"2074.96,-33.49 2064.44,-34.72 2073.43,-40.32 2074.96,-33.49\"/>\n",
       "</g>\n",
       "<!-- (&#39;today&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;module&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge37\" class=\"edge\">\n",
       "<title>(&#39;today&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;module&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M2737.96,-18C2740.62,-18 2743.27,-18 2745.93,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"2746.17,-21.5 2756.17,-18 2746.17,-14.5 2746.17,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;today&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;gensim&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge38\" class=\"edge\">\n",
       "<title>(&#39;today&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;gensim&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M2660.64,-34.39C2688.83,-42.01 2723.94,-50.21 2755.99,-54 2879.57,-68.62 2912.33,-68 3035.99,-54 3065.69,-50.64 3097.95,-43.81 3125.46,-36.99\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"3126.53,-40.33 3135.37,-34.49 3124.82,-33.55 3126.53,-40.33\"/>\n",
       "</g>\n",
       "<!-- (&#39;module&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;gensim&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge39\" class=\"edge\">\n",
       "<title>(&#39;module&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;gensim&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M3035.79,-18C3038.12,-18 3040.45,-18 3042.77,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"3042.98,-21.5 3052.98,-18 3042.98,-14.5 3042.98,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;module&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;implement&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge40\" class=\"edge\">\n",
       "<title>(&#39;module&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;implement&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M2953.61,-34.49C2983.06,-42.08 3019.65,-50.23 3052.99,-54 3176.64,-68 3209.2,-66.74 3332.99,-54 3365.89,-50.61 3401.76,-43.69 3432.27,-36.82\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"3433.43,-40.14 3442.4,-34.49 3431.87,-33.32 3433.43,-40.14\"/>\n",
       "</g>\n",
       "<!-- (&#39;TextRank&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"node13\" class=\"node\">\n",
       "<title>(&#39;TextRank&#39;, &#39;PROPN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"3832.99\" cy=\"-18\" rx=\"153.27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"3832.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;TextRank&#39;, &#39;PROPN&#39;) (0.0179)</text>\n",
       "</g>\n",
       "<!-- (&#39;module&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;TextRank&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge41\" class=\"edge\">\n",
       "<title>(&#39;module&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;TextRank&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M2953.61,-34.49C2983.06,-42.08 3019.65,-50.23 3052.99,-54 3187.24,-69.2 3526.6,-67.91 3660.99,-54 3693.71,-50.61 3729.37,-43.69 3759.7,-36.82\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"3760.81,-40.15 3769.77,-34.49 3759.24,-33.33 3760.81,-40.15\"/>\n",
       "</g>\n",
       "<!-- (&#39;gensim&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;implement&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge42\" class=\"edge\">\n",
       "<title>(&#39;gensim&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;implement&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M3332.98,-18C3335.45,-18 3337.93,-18 3340.4,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"3340.55,-21.5 3350.55,-18 3340.55,-14.5 3340.55,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;gensim&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;TextRank&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge43\" class=\"edge\">\n",
       "<title>(&#39;gensim&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;TextRank&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M3250.98,-34.49C3280.63,-42.08 3317.44,-50.23 3350.99,-54 3487.9,-69.4 3523.94,-68.19 3660.99,-54 3693.71,-50.61 3729.37,-43.69 3759.7,-36.82\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"3760.81,-40.15 3769.77,-34.49 3759.24,-33.33 3760.81,-40.15\"/>\n",
       "</g>\n",
       "<!-- (&#39;unsupervised&#39;, &#39;ADJ&#39;) -->\n",
       "<g id=\"node14\" class=\"node\">\n",
       "<title>(&#39;unsupervised&#39;, &#39;ADJ&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"4158.99\" cy=\"-18\" rx=\"154.87\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"4158.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;unsupervised&#39;, &#39;ADJ&#39;) (0.0120)</text>\n",
       "</g>\n",
       "<!-- (&#39;gensim&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;unsupervised&#39;, &#39;ADJ&#39;) -->\n",
       "<g id=\"edge44\" class=\"edge\">\n",
       "<title>(&#39;gensim&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;unsupervised&#39;, &#39;ADJ&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M3250.98,-34.49C3280.63,-42.08 3317.44,-50.23 3350.99,-54 3491.22,-69.77 3845.62,-68.45 3985.99,-54 4018.89,-50.61 4054.76,-43.69 4085.27,-36.82\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"4086.43,-40.14 4095.4,-34.49 4084.87,-33.32 4086.43,-40.14\"/>\n",
       "</g>\n",
       "<!-- (&#39;gensim&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;use&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge45\" class=\"edge\">\n",
       "<title>(&#39;gensim&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;use&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M3250.98,-34.49C3280.63,-42.08 3317.44,-50.23 3350.99,-54 3472.32,-67.65 12020.91,-69.75 12141.99,-54 12167.53,-50.68 12195.1,-43.98 12218.7,-37.26\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"12219.93,-40.55 12228.55,-34.39 12217.97,-33.83 12219.93,-40.55\"/>\n",
       "</g>\n",
       "<!-- (&#39;Okapi&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"node65\" class=\"node\">\n",
       "<title>(&#39;Okapi&#39;, &#39;PROPN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"11406.99\" cy=\"-18\" rx=\"136.48\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"11406.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;Okapi&#39;, &#39;PROPN&#39;) (0.0107)</text>\n",
       "</g>\n",
       "<!-- (&#39;gensim&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;Okapi&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge46\" class=\"edge\">\n",
       "<title>(&#39;gensim&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;Okapi&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M3250.98,-34.49C3280.63,-42.08 3317.44,-50.23 3350.99,-54 3460.05,-66.27 11143.96,-66.57 11252.99,-54 11282.14,-50.64 11313.79,-43.81 11340.78,-36.99\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"11341.68,-40.37 11350.49,-34.49 11339.94,-33.6 11341.68,-40.37\"/>\n",
       "</g>\n",
       "<!-- (&#39;implement&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;TextRank&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge47\" class=\"edge\">\n",
       "<title>(&#39;implement&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;TextRank&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M3661.51,-18C3664.14,-18 3666.78,-18 3669.42,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"3669.59,-21.5 3679.59,-18 3669.59,-14.5 3669.59,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;implement&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;unsupervised&#39;, &#39;ADJ&#39;) -->\n",
       "<g id=\"edge48\" class=\"edge\">\n",
       "<title>(&#39;implement&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;unsupervised&#39;, &#39;ADJ&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M3569.96,-34.49C3602.63,-42.08 3643.16,-50.23 3679.99,-54 3815.28,-67.85 3850.7,-67.93 3985.99,-54 4018.89,-50.61 4054.76,-43.69 4085.27,-36.82\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"4086.43,-40.14 4095.4,-34.49 4084.87,-33.32 4086.43,-40.14\"/>\n",
       "</g>\n",
       "<!-- (&#39;algorithm&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"node15\" class=\"node\">\n",
       "<title>(&#39;algorithm&#39;, &#39;PROPN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"4486.99\" cy=\"-18\" rx=\"155.17\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"4486.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;algorithm&#39;, &#39;PROPN&#39;) (0.0166)</text>\n",
       "</g>\n",
       "<!-- (&#39;implement&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;algorithm&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge49\" class=\"edge\">\n",
       "<title>(&#39;implement&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;algorithm&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M3569.96,-34.49C3602.63,-42.08 3643.16,-50.23 3679.99,-54 3820.15,-68.35 4173.84,-68.43 4313.99,-54 4346.89,-50.61 4382.76,-43.69 4413.27,-36.82\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"4414.43,-40.14 4423.4,-34.49 4412.87,-33.32 4414.43,-40.14\"/>\n",
       "</g>\n",
       "<!-- (&#39;TextRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;unsupervised&#39;, &#39;ADJ&#39;) -->\n",
       "<g id=\"edge50\" class=\"edge\">\n",
       "<title>(&#39;TextRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;unsupervised&#39;, &#39;ADJ&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M3986.44,-18C3989.04,-18 3991.65,-18 3994.25,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"3994.3,-21.5 4004.3,-18 3994.3,-14.5 3994.3,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;TextRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;algorithm&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge51\" class=\"edge\">\n",
       "<title>(&#39;TextRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;algorithm&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M3895.84,-34.49C3927.94,-42.08 3967.78,-50.23 4003.99,-54 4141.03,-68.27 4176.94,-68.11 4313.99,-54 4346.89,-50.61 4382.76,-43.69 4413.27,-36.82\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"4414.43,-40.14 4423.4,-34.49 4412.87,-33.32 4414.43,-40.14\"/>\n",
       "</g>\n",
       "<!-- (&#39;base&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"node16\" class=\"node\">\n",
       "<title>(&#39;base&#39;, &#39;VERB&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"4783.99\" cy=\"-18\" rx=\"123.48\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"4783.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;base&#39;, &#39;VERB&#39;) (0.0129)</text>\n",
       "</g>\n",
       "<!-- (&#39;TextRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;base&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge52\" class=\"edge\">\n",
       "<title>(&#39;TextRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;base&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M3895.84,-34.49C3927.94,-42.08 3967.78,-50.23 4003.99,-54 4145.01,-68.68 4501.3,-71.56 4641.99,-54 4668.84,-50.65 4697.89,-43.87 4722.68,-37.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"4723.63,-40.45 4732.32,-34.39 4721.74,-33.71 4723.63,-40.45\"/>\n",
       "</g>\n",
       "<!-- (&#39;TextRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;use&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge56\" class=\"edge\">\n",
       "<title>(&#39;TextRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;use&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M3895.84,-34.49C3927.94,-42.08 3967.78,-50.23 4003.99,-54 4116.41,-65.71 12029.91,-68.58 12141.99,-54 12167.53,-50.68 12195.1,-43.98 12218.7,-37.26\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"12219.93,-40.55 12228.55,-34.39 12217.97,-33.83 12219.93,-40.55\"/>\n",
       "</g>\n",
       "<!-- (&#39;sentence&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node51\" class=\"node\">\n",
       "<title>(&#39;sentence&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"7704.99\" cy=\"-18\" rx=\"147.57\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"7704.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;sentence&#39;, &#39;NOUN&#39;) (0.0830)</text>\n",
       "</g>\n",
       "<!-- (&#39;TextRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;sentence&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge55\" class=\"edge\">\n",
       "<title>(&#39;TextRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;sentence&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M3895.84,-34.49C3927.94,-42.08 3967.78,-50.23 4003.99,-54 4199.38,-74.34 7344.68,-75.06 7539.99,-54 7571.28,-50.63 7605.34,-43.75 7634.35,-36.91\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"7635.48,-40.23 7644.38,-34.49 7633.84,-33.43 7635.48,-40.23\"/>\n",
       "</g>\n",
       "<!-- (&#39;edge&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node54\" class=\"node\">\n",
       "<title>(&#39;edge&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"8268.99\" cy=\"-18\" rx=\"128.08\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"8268.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;edge&#39;, &#39;NOUN&#39;) (0.0400)</text>\n",
       "</g>\n",
       "<!-- (&#39;TextRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;edge&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge54\" class=\"edge\">\n",
       "<title>(&#39;TextRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;edge&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M3895.84,-34.49C3927.94,-42.08 3967.78,-50.23 4003.99,-54 4117.79,-65.85 8009.41,-67.8 8122.99,-54 8150.56,-50.65 8180.43,-43.87 8205.92,-37.09\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"8207.1,-40.39 8215.83,-34.39 8205.26,-33.64 8207.1,-40.39\"/>\n",
       "</g>\n",
       "<!-- (&#39;weight&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node55\" class=\"node\">\n",
       "<title>(&#39;weight&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"15714.99\" cy=\"-18\" rx=\"137.58\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"15714.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;weight&#39;, &#39;NOUN&#39;) (0.0071)</text>\n",
       "</g>\n",
       "<!-- (&#39;TextRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;weight&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge53\" class=\"edge\">\n",
       "<title>(&#39;TextRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;weight&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M3895.84,-34.49C3927.94,-42.08 3967.78,-50.23 4003.99,-54 4163.61,-70.62 15399.53,-72.16 15558.99,-54 15588.63,-50.62 15620.83,-43.75 15648.24,-36.91\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"15649.28,-40.26 15658.11,-34.39 15647.56,-33.47 15649.28,-40.26\"/>\n",
       "</g>\n",
       "<!-- (&#39;TextRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;Okapi&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge57\" class=\"edge\">\n",
       "<title>(&#39;TextRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;Okapi&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M3895.84,-34.49C3927.94,-42.08 3967.78,-50.23 4003.99,-54 4204.27,-74.85 11052.95,-77.07 11252.99,-54 11282.14,-50.64 11313.79,-43.81 11340.78,-36.99\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"11341.68,-40.37 11350.49,-34.49 11339.94,-33.6 11341.68,-40.37\"/>\n",
       "</g>\n",
       "<!-- (&#39;BM25&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"node66\" class=\"node\">\n",
       "<title>(&#39;BM25&#39;, &#39;PROPN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"11698.99\" cy=\"-18\" rx=\"137.58\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"11698.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;BM25&#39;, &#39;PROPN&#39;) (0.0115)</text>\n",
       "</g>\n",
       "<!-- (&#39;TextRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;BM25&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge58\" class=\"edge\">\n",
       "<title>(&#39;TextRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;BM25&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M3895.84,-34.49C3927.94,-42.08 3967.78,-50.23 4003.99,-54 4212.28,-75.69 11334.92,-77.7 11542.99,-54 11572.63,-50.62 11604.83,-43.75 11632.24,-36.91\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"11633.28,-40.26 11642.11,-34.39 11631.56,-33.47 11633.28,-40.26\"/>\n",
       "</g>\n",
       "<!-- (&#39;unsupervised&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;algorithm&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge59\" class=\"edge\">\n",
       "<title>(&#39;unsupervised&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;algorithm&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M4313.7,-18C4316.32,-18 4318.93,-18 4321.55,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"4321.64,-21.5 4331.64,-18 4321.64,-14.5 4321.64,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;unsupervised&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;base&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge60\" class=\"edge\">\n",
       "<title>(&#39;unsupervised&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;base&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M4222.58,-34.49C4255.07,-42.08 4295.37,-50.23 4331.99,-54 4469.04,-68.11 4505.27,-71.06 4641.99,-54 4668.84,-50.65 4697.89,-43.87 4722.68,-37.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"4723.63,-40.45 4732.32,-34.39 4721.74,-33.71 4723.63,-40.45\"/>\n",
       "</g>\n",
       "<!-- (&#39;weight&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"node17\" class=\"node\">\n",
       "<title>(&#39;weight&#39;, &#39;VERB&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"5058.99\" cy=\"-18\" rx=\"133.78\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"5058.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;weight&#39;, &#39;VERB&#39;) (0.0148)</text>\n",
       "</g>\n",
       "<!-- (&#39;unsupervised&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;weight&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge61\" class=\"edge\">\n",
       "<title>(&#39;unsupervised&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;weight&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M4222.58,-34.49C4255.07,-42.08 4295.37,-50.23 4331.99,-54 4459.1,-67.08 4780.07,-68.82 4906.99,-54 4935.77,-50.64 4967.01,-43.81 4993.63,-37\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"4994.81,-40.31 5003.6,-34.39 4993.04,-33.54 4994.81,-40.31\"/>\n",
       "</g>\n",
       "<!-- (&#39;algorithm&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;base&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge62\" class=\"edge\">\n",
       "<title>(&#39;algorithm&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;base&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M4642.45,-18C4645.07,-18 4647.69,-18 4650.31,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"4650.42,-21.5 4660.42,-18 4650.42,-14.5 4650.42,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;algorithm&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;weight&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge63\" class=\"edge\">\n",
       "<title>(&#39;algorithm&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;weight&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M4550.96,-34.49C4583.63,-42.08 4624.16,-50.23 4660.99,-54 4769.75,-65.13 4798.39,-66.68 4906.99,-54 4935.77,-50.64 4967.01,-43.81 4993.63,-37\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"4994.81,-40.31 5003.6,-34.39 4993.04,-33.54 4994.81,-40.31\"/>\n",
       "</g>\n",
       "<!-- (&#39;graph&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node18\" class=\"node\">\n",
       "<title>(&#39;graph&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"5343.99\" cy=\"-18\" rx=\"133.48\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"5343.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;graph&#39;, &#39;NOUN&#39;) (0.0237)</text>\n",
       "</g>\n",
       "<!-- (&#39;algorithm&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;graph&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge64\" class=\"edge\">\n",
       "<title>(&#39;algorithm&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;graph&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M4550.96,-34.49C4583.63,-42.08 4624.16,-50.23 4660.99,-54 4778.6,-66.04 5075.58,-67.8 5192.99,-54 5221.47,-50.65 5252.36,-43.87 5278.74,-37.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"5279.83,-40.41 5288.62,-34.49 5278.05,-33.64 5279.83,-40.41\"/>\n",
       "</g>\n",
       "<!-- (&#39;base&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;weight&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge65\" class=\"edge\">\n",
       "<title>(&#39;base&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;weight&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M4907.52,-18C4909.98,-18 4912.43,-18 4914.89,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"4914.98,-21.5 4924.98,-18 4914.98,-14.5 4914.98,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;base&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;graph&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge66\" class=\"edge\">\n",
       "<title>(&#39;base&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;graph&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M4835.29,-34.39C4861.77,-42.01 4894.78,-50.2 4924.99,-54 5043.17,-68.85 5074.69,-67.91 5192.99,-54 5221.47,-50.65 5252.36,-43.87 5278.74,-37.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"5279.83,-40.41 5288.62,-34.49 5278.05,-33.64 5279.83,-40.41\"/>\n",
       "</g>\n",
       "<!-- (&#39;paper&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node19\" class=\"node\">\n",
       "<title>(&#39;paper&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"5627.99\" cy=\"-18\" rx=\"132.68\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"5627.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;paper&#39;, &#39;NOUN&#39;) (0.0173)</text>\n",
       "</g>\n",
       "<!-- (&#39;base&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;paper&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge67\" class=\"edge\">\n",
       "<title>(&#39;base&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;paper&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M4835.29,-34.39C4861.77,-42.01 4894.78,-50.2 4924.99,-54 5046.7,-69.29 5355.16,-68.32 5476.99,-54 5505.59,-50.64 5536.62,-43.81 5563.07,-37\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"5564.19,-40.32 5572.97,-34.39 5562.41,-33.55 5564.19,-40.32\"/>\n",
       "</g>\n",
       "<!-- (&#39;weight&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;graph&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge68\" class=\"edge\">\n",
       "<title>(&#39;weight&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;graph&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M5193.14,-18C5195.58,-18 5198.03,-18 5200.47,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"5200.52,-21.5 5210.52,-18 5200.52,-14.5 5200.52,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;weight&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;paper&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge69\" class=\"edge\">\n",
       "<title>(&#39;weight&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;paper&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M5114.38,-34.39C5142.95,-42.01 5178.53,-50.21 5210.99,-54 5328.41,-67.72 5359.58,-67.8 5476.99,-54 5505.59,-50.64 5536.62,-43.81 5563.07,-37\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"5564.19,-40.32 5572.97,-34.39 5562.41,-33.55 5564.19,-40.32\"/>\n",
       "</g>\n",
       "<!-- (&#39;Mihalcea&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"node20\" class=\"node\">\n",
       "<title>(&#39;Mihalcea&#39;, &#39;PROPN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"5929.99\" cy=\"-18\" rx=\"151.37\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"5929.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;Mihalcea&#39;, &#39;PROPN&#39;) (0.0149)</text>\n",
       "</g>\n",
       "<!-- (&#39;weight&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;Mihalcea&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge70\" class=\"edge\">\n",
       "<title>(&#39;weight&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;Mihalcea&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M5114.38,-34.39C5142.95,-42.01 5178.53,-50.21 5210.99,-54 5332.39,-68.18 5639.44,-66.8 5760.99,-54 5793.15,-50.61 5828.2,-43.69 5858,-36.82\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"5858.96,-40.19 5867.89,-34.49 5857.35,-33.37 5858.96,-40.19\"/>\n",
       "</g>\n",
       "<!-- (&#39;graph&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;paper&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge71\" class=\"edge\">\n",
       "<title>(&#39;graph&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;paper&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M5477.39,-18C5480.01,-18 5482.63,-18 5485.24,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"5485.33,-21.5 5495.33,-18 5485.33,-14.5 5485.33,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;graph&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;Mihalcea&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge72\" class=\"edge\">\n",
       "<title>(&#39;graph&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;Mihalcea&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M5399.36,-34.49C5427.68,-42.08 5462.87,-50.22 5494.99,-54 5612.4,-67.8 5643.42,-66.38 5760.99,-54 5793.15,-50.61 5828.2,-43.69 5858,-36.82\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"5858.96,-40.19 5867.89,-34.49 5857.35,-33.37 5858.96,-40.19\"/>\n",
       "</g>\n",
       "<!-- (&#39;et&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"node21\" class=\"node\">\n",
       "<title>(&#39;et&#39;, &#39;PROPN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"6217.99\" cy=\"-18\" rx=\"118.88\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"6217.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;et&#39;, &#39;PROPN&#39;) (0.0241)</text>\n",
       "</g>\n",
       "<!-- (&#39;graph&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;et&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge73\" class=\"edge\">\n",
       "<title>(&#39;graph&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;et&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M5399.36,-34.49C5427.68,-42.08 5462.87,-50.22 5494.99,-54 5624.32,-69.2 5951.84,-70.69 6080.99,-54 6106.82,-50.66 6134.73,-43.93 6158.57,-37.17\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"6159.55,-40.53 6168.18,-34.39 6157.6,-33.81 6159.55,-40.53\"/>\n",
       "</g>\n",
       "<!-- (&#39;vertex&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node50\" class=\"node\">\n",
       "<title>(&#39;vertex&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"7403.99\" cy=\"-18\" rx=\"135.68\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"7403.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;vertex&#39;, &#39;NOUN&#39;) (0.0095)</text>\n",
       "</g>\n",
       "<!-- (&#39;graph&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;vertex&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge74\" class=\"edge\">\n",
       "<title>(&#39;graph&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;vertex&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M5399.36,-34.49C5427.68,-42.08 5462.87,-50.22 5494.99,-54 5688.66,-76.77 7056.27,-76.34 7249.99,-54 7279.26,-50.62 7311.06,-43.75 7338.11,-36.91\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"7339.05,-40.28 7347.85,-34.39 7337.3,-33.5 7339.05,-40.28\"/>\n",
       "</g>\n",
       "<!-- (&#39;graph&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;sentence&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge75\" class=\"edge\">\n",
       "<title>(&#39;graph&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;sentence&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M5399.36,-34.49C5427.68,-42.08 5462.87,-50.22 5494.99,-54 5607.82,-67.26 7427.03,-66.18 7539.99,-54 7571.28,-50.63 7605.34,-43.75 7634.35,-36.91\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"7635.48,-40.23 7644.38,-34.49 7633.84,-33.43 7635.48,-40.23\"/>\n",
       "</g>\n",
       "<!-- (&#39;paper&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;Mihalcea&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge76\" class=\"edge\">\n",
       "<title>(&#39;paper&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;Mihalcea&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M5760.7,-18C5763.17,-18 5765.63,-18 5768.1,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"5768.23,-21.5 5778.23,-18 5768.23,-14.5 5768.23,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;paper&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;et&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge77\" class=\"edge\">\n",
       "<title>(&#39;paper&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;et&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M5683.01,-34.39C5711.39,-42.01 5746.74,-50.21 5778.99,-54 5912.29,-69.67 5947.87,-71.2 6080.99,-54 6106.82,-50.66 6134.73,-43.93 6158.57,-37.17\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"6159.55,-40.53 6168.18,-34.39 6157.6,-33.81 6159.55,-40.53\"/>\n",
       "</g>\n",
       "<!-- (&#39;al&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"node22\" class=\"node\">\n",
       "<title>(&#39;al&#39;, &#39;PROPN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"6472.99\" cy=\"-18\" rx=\"118.08\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"6472.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;al&#39;, &#39;PROPN&#39;) (0.0393)</text>\n",
       "</g>\n",
       "<!-- (&#39;paper&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;al&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge78\" class=\"edge\">\n",
       "<title>(&#39;paper&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;al&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M5683.01,-34.39C5711.39,-42.01 5746.74,-50.21 5778.99,-54 5902.14,-68.48 6214.03,-70 6336.99,-54 6362.53,-50.68 6390.1,-43.98 6413.7,-37.26\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"6414.93,-40.55 6423.55,-34.39 6412.97,-33.83 6414.93,-40.55\"/>\n",
       "</g>\n",
       "<!-- (&#39;Barrios&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"node69\" class=\"node\">\n",
       "<title>(&#39;Barrios&#39;, &#39;PROPN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"6752.99\" cy=\"-18\" rx=\"143.77\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"6752.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;Barrios&#39;, &#39;PROPN&#39;) (0.0079)</text>\n",
       "</g>\n",
       "<!-- (&#39;paper&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;Barrios&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge79\" class=\"edge\">\n",
       "<title>(&#39;paper&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;Barrios&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M5683.01,-34.39C5711.39,-42.01 5746.74,-50.21 5778.99,-54 5958.2,-75.07 6411.62,-73.69 6590.99,-54 6621.73,-50.63 6655.18,-43.75 6683.65,-36.91\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"6684.62,-40.27 6693.5,-34.49 6682.96,-33.47 6684.62,-40.27\"/>\n",
       "</g>\n",
       "<!-- (&#39;Mihalcea&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;et&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge80\" class=\"edge\">\n",
       "<title>(&#39;Mihalcea&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;et&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M6081.58,-18C6084.02,-18 6086.45,-18 6088.89,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"6088.9,-21.5 6098.9,-18 6088.9,-14.5 6088.9,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;Mihalcea&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;al&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge81\" class=\"edge\">\n",
       "<title>(&#39;Mihalcea&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;al&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M5992.09,-34.49C6023.82,-42.08 6063.19,-50.23 6098.99,-54 6204.19,-65.08 6232.1,-67.65 6336.99,-54 6362.53,-50.68 6390.1,-43.98 6413.7,-37.26\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"6414.93,-40.55 6423.55,-34.39 6412.97,-33.83 6414.93,-40.55\"/>\n",
       "</g>\n",
       "<!-- (&#39;et&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;al&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge82\" class=\"edge\">\n",
       "<title>(&#39;et&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;al&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M6337.02,-18C6339.49,-18 6341.95,-18 6344.42,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"6344.55,-21.5 6354.55,-18 6344.55,-14.5 6344.55,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;add&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"node23\" class=\"node\">\n",
       "<title>(&#39;add&#39;, &#39;VERB&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"11133.99\" cy=\"-18\" rx=\"118.88\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"11133.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;add&#39;, &#39;VERB&#39;) (0.0042)</text>\n",
       "</g>\n",
       "<!-- (&#39;incubator&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node24\" class=\"node\">\n",
       "<title>(&#39;incubator&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"10244.99\" cy=\"-18\" rx=\"150.27\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"10244.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;incubator&#39;, &#39;NOUN&#39;) (0.0055)</text>\n",
       "</g>\n",
       "<!-- (&#39;add&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;incubator&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge83\" class=\"edge\">\n",
       "<title>(&#39;add&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;incubator&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M11084.18,-34.39C11058.45,-42 11026.38,-50.2 10996.99,-54 10868.28,-70.63 10542.05,-67.67 10412.99,-54 10381.01,-50.61 10346.17,-43.69 10316.55,-36.82\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"10317.25,-33.39 10306.72,-34.49 10315.64,-40.2 10317.25,-33.39\"/>\n",
       "</g>\n",
       "<!-- (&#39;student&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node25\" class=\"node\">\n",
       "<title>(&#39;student&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"10554.99\" cy=\"-18\" rx=\"141.88\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"10554.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;student&#39;, &#39;NOUN&#39;) (0.0070)</text>\n",
       "</g>\n",
       "<!-- (&#39;add&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;student&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge84\" class=\"edge\">\n",
       "<title>(&#39;add&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;student&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M11084.18,-34.39C11058.45,-42 11026.38,-50.2 10996.99,-54 10872.69,-70.06 10839.56,-67.84 10714.99,-54 10684.61,-50.62 10651.58,-43.75 10623.46,-36.91\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"10624.28,-33.5 10613.73,-34.49 10622.59,-40.3 10624.28,-33.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;Olavur&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"node26\" class=\"node\">\n",
       "<title>(&#39;Olavur&#39;, &#39;PROPN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"10855.99\" cy=\"-18\" rx=\"141.07\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"10855.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;Olavur&#39;, &#39;PROPN&#39;) (0.0090)</text>\n",
       "</g>\n",
       "<!-- (&#39;add&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;Olavur&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge85\" class=\"edge\">\n",
       "<title>(&#39;add&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;Olavur&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M11014.8,-18C11012.32,-18 11009.84,-18 11007.36,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"11007.16,-14.5 10997.16,-18 11007.16,-21.5 11007.16,-14.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;incubator&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;student&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge86\" class=\"edge\">\n",
       "<title>(&#39;incubator&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;student&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M10395.15,-18C10397.79,-18 10400.43,-18 10403.07,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"10403.25,-21.5 10413.25,-18 10403.25,-14.5 10403.25,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;incubator&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;Olavur&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge87\" class=\"edge\">\n",
       "<title>(&#39;incubator&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;Olavur&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M10306.72,-34.49C10338.26,-42.08 10377.39,-50.23 10412.99,-54 10538.51,-67.3 10571.55,-68.02 10696.99,-54 10727.05,-50.64 10759.72,-43.81 10787.59,-36.99\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"10788.77,-40.31 10797.62,-34.49 10787.07,-33.52 10788.77,-40.31\"/>\n",
       "</g>\n",
       "<!-- (&#39;Mortensen&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"node27\" class=\"node\">\n",
       "<title>(&#39;Mortensen&#39;, &#39;PROPN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"9916.99\" cy=\"-18\" rx=\"159.77\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"9916.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;Mortensen&#39;, &#39;PROPN&#39;) (0.0103)</text>\n",
       "</g>\n",
       "<!-- (&#39;incubator&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;Mortensen&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge88\" class=\"edge\">\n",
       "<title>(&#39;incubator&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;Mortensen&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M10094.85,-18C10092.36,-18 10089.87,-18 10087.38,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"10087.15,-14.5 10077.15,-18 10087.15,-21.5 10087.15,-14.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;student&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;Olavur&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge89\" class=\"edge\">\n",
       "<title>(&#39;student&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;Olavur&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M10696.97,-18C10699.45,-18 10701.94,-18 10704.43,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"10704.67,-21.5 10714.67,-18 10704.67,-14.5 10704.67,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;student&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;Mortensen&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge90\" class=\"edge\">\n",
       "<title>(&#39;student&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;Mortensen&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M10496.25,-34.49C10466.23,-42.08 10428.95,-50.23 10394.99,-54 10262.47,-68.72 10227.66,-67.28 10094.99,-54 10061.02,-50.6 10023.94,-43.63 9992.46,-36.73\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"9992.97,-33.26 9982.45,-34.49 9991.45,-40.09 9992.97,-33.26\"/>\n",
       "</g>\n",
       "<!-- (&#39;see&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"node28\" class=\"node\">\n",
       "<title>(&#39;see&#39;, &#39;VERB&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"8798.99\" cy=\"-18\" rx=\"117.78\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"8798.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;see&#39;, &#39;VERB&#39;) (0.0217)</text>\n",
       "</g>\n",
       "<!-- (&#39;student&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;see&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge91\" class=\"edge\">\n",
       "<title>(&#39;student&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;see&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M10496.25,-34.49C10466.23,-42.08 10428.95,-50.23 10394.99,-54 10233.76,-71.91 9095.86,-74.93 8934.99,-54 8909.45,-50.68 8881.88,-43.98 8858.28,-37.26\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"8859.01,-33.83 8848.43,-34.39 8857.05,-40.55 8859.01,-33.83\"/>\n",
       "</g>\n",
       "<!-- (&#39;Olavur&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;Mortensen&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge92\" class=\"edge\">\n",
       "<title>(&#39;Olavur&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;Mortensen&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M10797.62,-34.49C10767.79,-42.08 10730.74,-50.23 10696.99,-54 10564.04,-68.86 10228.1,-67.33 10094.99,-54 10061.02,-50.6 10023.94,-43.63 9992.46,-36.73\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"9992.97,-33.26 9982.45,-34.49 9991.45,-40.09 9992.97,-33.26\"/>\n",
       "</g>\n",
       "<!-- (&#39;Olavur&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;see&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge93\" class=\"edge\">\n",
       "<title>(&#39;Olavur&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;see&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M10797.62,-34.49C10767.79,-42.08 10730.74,-50.23 10696.99,-54 10502.42,-75.75 9129.13,-79.26 8934.99,-54 8909.45,-50.68 8881.88,-43.98 8858.28,-37.26\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"8859.01,-33.83 8848.43,-34.39 8857.05,-40.55 8859.01,-33.83\"/>\n",
       "</g>\n",
       "<!-- (&#39;previous&#39;, &#39;ADJ&#39;) -->\n",
       "<g id=\"node29\" class=\"node\">\n",
       "<title>(&#39;previous&#39;, &#39;ADJ&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"9066.99\" cy=\"-18\" rx=\"131.88\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"9066.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;previous&#39;, &#39;ADJ&#39;) (0.0134)</text>\n",
       "</g>\n",
       "<!-- (&#39;Olavur&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;previous&#39;, &#39;ADJ&#39;) -->\n",
       "<g id=\"edge94\" class=\"edge\">\n",
       "<title>(&#39;Olavur&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;previous&#39;, &#39;ADJ&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M10797.62,-34.49C10767.79,-42.08 10730.74,-50.23 10696.99,-54 10533.56,-72.27 9380.29,-73.32 9216.99,-54 9188.57,-50.64 9157.75,-43.81 9131.47,-37\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"9132.2,-33.57 9121.64,-34.39 9130.41,-40.34 9132.2,-33.57\"/>\n",
       "</g>\n",
       "<!-- (&#39;Mortensen&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;see&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge95\" class=\"edge\">\n",
       "<title>(&#39;Mortensen&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;see&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M9851.53,-34.49C9818.1,-42.09 9776.64,-50.23 9738.99,-54 9561.21,-71.8 9112.16,-77.05 8934.99,-54 8909.45,-50.68 8881.88,-43.98 8858.28,-37.26\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"8859.01,-33.83 8848.43,-34.39 8857.05,-40.55 8859.01,-33.83\"/>\n",
       "</g>\n",
       "<!-- (&#39;Mortensen&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;previous&#39;, &#39;ADJ&#39;) -->\n",
       "<g id=\"edge96\" class=\"edge\">\n",
       "<title>(&#39;Mortensen&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;previous&#39;, &#39;ADJ&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M9851.53,-34.49C9818.1,-42.09 9776.64,-50.23 9738.99,-54 9623.57,-65.56 9332.19,-67.63 9216.99,-54 9188.57,-50.64 9157.75,-43.81 9131.47,-37\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"9132.2,-33.57 9121.64,-34.39 9130.41,-40.34 9132.2,-33.57\"/>\n",
       "</g>\n",
       "<!-- (&#39;post&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node30\" class=\"node\">\n",
       "<title>(&#39;post&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"9342.99\" cy=\"-18\" rx=\"126.18\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"9342.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;post&#39;, &#39;NOUN&#39;) (0.0165)</text>\n",
       "</g>\n",
       "<!-- (&#39;Mortensen&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;post&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge97\" class=\"edge\">\n",
       "<title>(&#39;Mortensen&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;post&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M9851.53,-34.49C9818.1,-42.09 9776.64,-50.23 9738.99,-54 9627.55,-65.16 9598.15,-67.68 9486.99,-54 9459.78,-50.65 9430.32,-43.87 9405.18,-37.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"9405.98,-33.68 9395.41,-34.39 9404.12,-40.42 9405.98,-33.68\"/>\n",
       "</g>\n",
       "<!-- (&#39;see&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;previous&#39;, &#39;ADJ&#39;) -->\n",
       "<g id=\"edge98\" class=\"edge\">\n",
       "<title>(&#39;see&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;previous&#39;, &#39;ADJ&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M8916.76,-18C8919.42,-18 8922.07,-18 8924.72,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"8924.95,-21.5 8934.95,-18 8924.95,-14.5 8924.95,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;see&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;post&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge99\" class=\"edge\">\n",
       "<title>(&#39;see&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;post&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M8848.43,-34.39C8873.96,-42 8905.8,-50.2 8934.99,-54 9051.34,-69.14 9082.54,-68.34 9198.99,-54 9226.2,-50.65 9255.66,-43.87 9280.8,-37.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"9281.86,-40.42 9290.57,-34.39 9280,-33.68 9281.86,-40.42\"/>\n",
       "</g>\n",
       "<!-- (&#39;blog&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node31\" class=\"node\">\n",
       "<title>(&#39;blog&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"9612.99\" cy=\"-18\" rx=\"126.18\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"9612.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;blog&#39;, &#39;NOUN&#39;) (0.0277)</text>\n",
       "</g>\n",
       "<!-- (&#39;see&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;blog&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge100\" class=\"edge\">\n",
       "<title>(&#39;see&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;blog&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M8848.43,-34.39C8873.96,-42 8905.8,-50.2 8934.99,-54 9052.66,-69.31 9351.21,-68.5 9468.99,-54 9496.2,-50.65 9525.66,-43.87 9550.8,-37.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"9551.86,-40.42 9560.57,-34.39 9550,-33.68 9551.86,-40.42\"/>\n",
       "</g>\n",
       "<!-- (&#39;see&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;sentence&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge102\" class=\"edge\">\n",
       "<title>(&#39;see&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;sentence&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M8749.55,-34.39C8724.02,-42 8692.17,-50.2 8662.99,-54 8492.43,-76.19 8060.19,-70.59 7888.99,-54 7853.17,-50.53 7813.97,-43.34 7780.99,-36.29\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"7781.48,-32.82 7770.96,-34.12 7779.99,-39.66 7781.48,-32.82\"/>\n",
       "</g>\n",
       "<!-- (&#39;similar&#39;, &#39;ADJ&#39;) -->\n",
       "<g id=\"node56\" class=\"node\">\n",
       "<title>(&#39;similar&#39;, &#39;ADJ&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"8538.99\" cy=\"-18\" rx=\"124.28\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"8538.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;similar&#39;, &#39;ADJ&#39;) (0.0227)</text>\n",
       "</g>\n",
       "<!-- (&#39;see&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;similar&#39;, &#39;ADJ&#39;) -->\n",
       "<g id=\"edge101\" class=\"edge\">\n",
       "<title>(&#39;see&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;similar&#39;, &#39;ADJ&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M8681.19,-18C8678.56,-18 8675.93,-18 8673.3,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"8673.15,-14.5 8663.15,-18 8673.15,-21.5 8673.15,-14.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;previous&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;post&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge103\" class=\"edge\">\n",
       "<title>(&#39;previous&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;post&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M9199.06,-18C9201.55,-18 9204.04,-18 9206.53,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"9206.77,-21.5 9216.77,-18 9206.77,-14.5 9206.77,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;previous&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;blog&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge104\" class=\"edge\">\n",
       "<title>(&#39;previous&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;blog&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M9121.64,-34.39C9149.83,-42.01 9184.94,-50.21 9216.99,-54 9328.21,-67.16 9357.83,-67.68 9468.99,-54 9496.2,-50.65 9525.66,-43.87 9550.8,-37.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"9551.86,-40.42 9560.57,-34.39 9550,-33.68 9551.86,-40.42\"/>\n",
       "</g>\n",
       "<!-- (&#39;post&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;blog&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge105\" class=\"edge\">\n",
       "<title>(&#39;post&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;blog&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M9469.29,-18C9471.74,-18 9474.18,-18 9476.63,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"9476.69,-21.5 9486.69,-18 9476.69,-14.5 9476.69,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;build&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"node32\" class=\"node\">\n",
       "<title>(&#39;build&#39;, &#39;VERB&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"14919.99\" cy=\"-18\" rx=\"125.38\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"14919.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;build&#39;, &#39;VERB&#39;) (0.0042)</text>\n",
       "</g>\n",
       "<!-- (&#39;build&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;popular&#39;, &#39;ADJ&#39;) -->\n",
       "<g id=\"edge107\" class=\"edge\">\n",
       "<title>(&#39;build&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;popular&#39;, &#39;ADJ&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M14867.94,-34.39C14841.08,-42.01 14807.6,-50.21 14776.99,-54 14585.17,-77.77 1051.87,-77.31 859.99,-54 832.42,-50.65 802.55,-43.87 777.06,-37.09\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"777.72,-33.64 767.15,-34.39 775.88,-40.39 777.72,-33.64\"/>\n",
       "</g>\n",
       "<!-- (&#39;top&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node33\" class=\"node\">\n",
       "<title>(&#39;top&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"15183.99\" cy=\"-18\" rx=\"120.78\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"15183.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;top&#39;, &#39;NOUN&#39;) (0.0055)</text>\n",
       "</g>\n",
       "<!-- (&#39;build&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;top&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge106\" class=\"edge\">\n",
       "<title>(&#39;build&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;top&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M15045.54,-18C15047.98,-18 15050.41,-18 15052.85,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"15052.85,-21.5 15062.85,-18 15052.85,-14.5 15052.85,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;build&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;PageRank&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge108\" class=\"edge\">\n",
       "<title>(&#39;build&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;PageRank&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M14867.94,-34.39C14841.08,-42.01 14807.6,-50.21 14776.99,-54 14649.41,-69.81 13747.87,-67.16 13619.99,-54 13587.09,-50.61 13551.22,-43.69 13520.71,-36.82\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"13521.11,-33.32 13510.58,-34.49 13519.55,-40.14 13521.11,-33.32\"/>\n",
       "</g>\n",
       "<!-- (&#39;top&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;popular&#39;, &#39;ADJ&#39;) -->\n",
       "<g id=\"edge109\" class=\"edge\">\n",
       "<title>(&#39;top&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;popular&#39;, &#39;ADJ&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M15133.43,-34.39C15107.33,-42.01 15074.79,-50.2 15044.99,-54 14947.27,-66.45 957.78,-65.88 859.99,-54 832.42,-50.65 802.55,-43.87 777.06,-37.09\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"777.72,-33.64 767.15,-34.39 775.88,-40.39 777.72,-33.64\"/>\n",
       "</g>\n",
       "<!-- (&#39;top&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;algorithm&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge111\" class=\"edge\">\n",
       "<title>(&#39;top&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;algorithm&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M15133.43,-34.39C15107.33,-42.01 15074.79,-50.2 15044.99,-54 14853.96,-78.34 1371.5,-74.17 1179.99,-54 1147.83,-50.61 1112.78,-43.69 1082.98,-36.82\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"1083.63,-33.37 1073.09,-34.49 1082.02,-40.19 1083.63,-33.37\"/>\n",
       "</g>\n",
       "<!-- (&#39;top&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;PageRank&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge110\" class=\"edge\">\n",
       "<title>(&#39;top&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;PageRank&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M15133.43,-34.39C15107.33,-42.01 15074.79,-50.2 15044.99,-54 14887.93,-74.01 13777.49,-70.21 13619.99,-54 13587.09,-50.61 13551.22,-43.69 13520.71,-36.82\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"13521.11,-33.32 13510.58,-34.49 13519.55,-40.14 13521.11,-33.32\"/>\n",
       "</g>\n",
       "<!-- (&#39;PageRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;algorithm&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge112\" class=\"edge\">\n",
       "<title>(&#39;PageRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;algorithm&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M13383.4,-34.49C13350.91,-42.08 13310.61,-50.23 13273.99,-54 13106.9,-71.2 1347.04,-71.59 1179.99,-54 1147.83,-50.61 1112.78,-43.69 1082.98,-36.82\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"1083.63,-33.37 1073.09,-34.49 1082.02,-40.19 1083.63,-33.37\"/>\n",
       "</g>\n",
       "<!-- (&#39;PageRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;algorithm&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge115\" class=\"edge\">\n",
       "<title>(&#39;PageRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;algorithm&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M13383.4,-34.49C13350.91,-42.08 13310.61,-50.23 13273.99,-54 13154.99,-66.25 4779.99,-66.18 4660.99,-54 4627.76,-50.6 4591.51,-43.63 4560.74,-36.73\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"4561.48,-33.31 4550.96,-34.49 4559.93,-40.13 4561.48,-33.31\"/>\n",
       "</g>\n",
       "<!-- (&#39;PageRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;graph&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge116\" class=\"edge\">\n",
       "<title>(&#39;PageRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;graph&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M13383.4,-34.49C13350.91,-42.08 13310.61,-50.23 13273.99,-54 13059.04,-76.13 5709.6,-79.23 5494.99,-54 5466.51,-50.65 5435.62,-43.87 5409.24,-37.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"5409.93,-33.64 5399.36,-34.49 5408.15,-40.41 5409.93,-33.64\"/>\n",
       "</g>\n",
       "<!-- (&#39;PageRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;Google&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge113\" class=\"edge\">\n",
       "<title>(&#39;PageRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;Google&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M13291.39,-18C13288.92,-18 13286.44,-18 13283.97,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"13283.8,-14.5 13273.8,-18 13283.8,-21.5 13283.8,-14.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;PageRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;use&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge114\" class=\"edge\">\n",
       "<title>(&#39;PageRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;use&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M13383.4,-34.49C13350.91,-42.08 13310.61,-50.23 13273.99,-54 13083.88,-73.57 12603.5,-78.66 12413.99,-54 12388.45,-50.68 12360.88,-43.98 12337.28,-37.26\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"12338.01,-33.83 12327.43,-34.39 12336.05,-40.55 12338.01,-33.83\"/>\n",
       "</g>\n",
       "<!-- (&#39;score&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node61\" class=\"node\">\n",
       "<title>(&#39;score&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"13750.99\" cy=\"-18\" rx=\"130.78\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"13750.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;score&#39;, &#39;NOUN&#39;) (0.0109)</text>\n",
       "</g>\n",
       "<!-- (&#39;PageRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;score&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge117\" class=\"edge\">\n",
       "<title>(&#39;PageRank&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;score&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M13602.55,-18C13605.04,-18 13607.53,-18 13610.01,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"13610.24,-21.5 13620.24,-18 13610.24,-14.5 13610.24,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;Google&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;use&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge118\" class=\"edge\">\n",
       "<title>(&#39;Google&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;use&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M13073.62,-34.49C13043.79,-42.08 13006.74,-50.23 12972.99,-54 12849.54,-67.8 12537.17,-70.03 12413.99,-54 12388.45,-50.68 12360.88,-43.98 12337.28,-37.26\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"12338.01,-33.83 12327.43,-34.39 12336.05,-40.55 12338.01,-33.83\"/>\n",
       "</g>\n",
       "<!-- (&#39;Google&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;rank&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge119\" class=\"edge\">\n",
       "<title>(&#39;Google&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;rank&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M13073.62,-34.49C13043.79,-42.08 13006.74,-50.23 12972.99,-54 12842.25,-68.62 12807.5,-70.51 12676.99,-54 12650.62,-50.66 12622.11,-43.93 12597.74,-37.17\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"12598.49,-33.75 12587.92,-34.39 12596.59,-40.48 12598.49,-33.75\"/>\n",
       "</g>\n",
       "<!-- (&#39;webpage&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node38\" class=\"node\">\n",
       "<title>(&#39;webpage&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"12824.99\" cy=\"-18\" rx=\"147.57\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"12824.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;webpage&#39;, &#39;NOUN&#39;) (0.0193)</text>\n",
       "</g>\n",
       "<!-- (&#39;Google&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;webpage&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge120\" class=\"edge\">\n",
       "<title>(&#39;Google&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;webpage&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M12990.21,-18C12987.76,-18 12985.31,-18 12982.86,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"12982.79,-14.5 12972.79,-18 12982.79,-21.5 12982.79,-14.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;use&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;rank&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge121\" class=\"edge\">\n",
       "<title>(&#39;use&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;rank&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M12396.36,-18C12398.83,-18 12401.3,-18 12403.78,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"12403.94,-21.5 12413.94,-18 12403.94,-14.5 12403.94,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;use&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;webpage&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge122\" class=\"edge\">\n",
       "<title>(&#39;use&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;webpage&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M12327.43,-34.39C12352.96,-42 12384.8,-50.2 12413.99,-54 12522.41,-68.11 12551.29,-65.72 12659.99,-54 12691.28,-50.63 12725.34,-43.75 12754.35,-36.91\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"12755.48,-40.23 12764.38,-34.49 12753.84,-33.43 12755.48,-40.23\"/>\n",
       "</g>\n",
       "<!-- (&#39;use&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;Okapi&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge123\" class=\"edge\">\n",
       "<title>(&#39;use&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;Okapi&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M12228.55,-34.39C12203.02,-42 12171.17,-50.2 12141.99,-54 12013.96,-70.66 11689.25,-68.79 11560.99,-54 11531.84,-50.64 11500.19,-43.81 11473.2,-36.99\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"11474.04,-33.6 11463.49,-34.49 11472.3,-40.37 11474.04,-33.6\"/>\n",
       "</g>\n",
       "<!-- (&#39;use&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;BM25&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge124\" class=\"edge\">\n",
       "<title>(&#39;use&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;BM25&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M12228.55,-34.39C12203.02,-42 12171.17,-50.2 12141.99,-54 12015.06,-70.52 11981.16,-68.57 11853.99,-54 11824.66,-50.64 11792.8,-43.81 11765.64,-36.99\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"11766.42,-33.58 11755.86,-34.49 11764.68,-40.36 11766.42,-33.58\"/>\n",
       "</g>\n",
       "<!-- (&#39;function&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node67\" class=\"node\">\n",
       "<title>(&#39;function&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"11997.99\" cy=\"-18\" rx=\"143.77\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"11997.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;function&#39;, &#39;NOUN&#39;) (0.0131)</text>\n",
       "</g>\n",
       "<!-- (&#39;use&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;function&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge125\" class=\"edge\">\n",
       "<title>(&#39;use&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;function&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M12159.64,-18C12157.04,-18 12154.44,-18 12151.84,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"12151.82,-14.5 12141.82,-18 12151.82,-21.5 12151.82,-14.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;rank&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;webpage&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge126\" class=\"edge\">\n",
       "<title>(&#39;rank&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;webpage&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M12659.9,-18C12662.34,-18 12664.79,-18 12667.24,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"12667.31,-21.5 12677.31,-18 12667.31,-14.5 12667.31,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;textrank&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node39\" class=\"node\">\n",
       "<title>(&#39;textrank&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"19928.99\" cy=\"-18\" rx=\"145.67\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"19928.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;textrank&#39;, &#39;NOUN&#39;) (0.0042)</text>\n",
       "</g>\n",
       "<!-- (&#39;work&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"node40\" class=\"node\">\n",
       "<title>(&#39;work&#39;, &#39;VERB&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"19640.99\" cy=\"-18\" rx=\"124.58\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"19640.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;work&#39;, &#39;VERB&#39;) (0.0055)</text>\n",
       "</g>\n",
       "<!-- (&#39;textrank&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;work&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge127\" class=\"edge\">\n",
       "<title>(&#39;textrank&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;work&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M19783.39,-18C19780.92,-18 19778.46,-18 19776,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"19775.86,-14.5 19765.86,-18 19775.86,-21.5 19775.86,-14.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;follow&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"node41\" class=\"node\">\n",
       "<title>(&#39;follow&#39;, &#39;VERB&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"18870.99\" cy=\"-18\" rx=\"129.98\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"18870.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;follow&#39;, &#39;VERB&#39;) (0.0070)</text>\n",
       "</g>\n",
       "<!-- (&#39;textrank&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;follow&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge128\" class=\"edge\">\n",
       "<title>(&#39;textrank&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;follow&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M19869.13,-34.49C19838.54,-42.08 19800.56,-50.23 19765.99,-54 19600.97,-72.01 19183.81,-73.76 19018.99,-54 18990.94,-50.64 18960.52,-43.81 18934.6,-37\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"18935.46,-33.6 18924.9,-34.39 18933.65,-40.37 18935.46,-33.6\"/>\n",
       "</g>\n",
       "<!-- (&#39;Pre&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node42\" class=\"node\">\n",
       "<title>(&#39;Pre&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"19140.99\" cy=\"-18\" rx=\"122.38\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"19140.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;Pre&#39;, &#39;NOUN&#39;) (0.0090)</text>\n",
       "</g>\n",
       "<!-- (&#39;textrank&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;Pre&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge129\" class=\"edge\">\n",
       "<title>(&#39;textrank&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;Pre&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M19869.13,-34.49C19838.54,-42.08 19800.56,-50.23 19765.99,-54 19658.85,-65.69 19387.92,-67.53 19280.99,-54 19254.62,-50.66 19226.11,-43.93 19201.74,-37.17\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"19202.49,-33.75 19191.92,-34.39 19200.59,-40.48 19202.49,-33.75\"/>\n",
       "</g>\n",
       "<!-- (&#39;work&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;follow&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge130\" class=\"edge\">\n",
       "<title>(&#39;work&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;follow&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M19589.32,-34.39C19562.64,-42.01 19529.4,-50.21 19498.99,-54 19393.14,-67.21 19124.9,-66.7 19018.99,-54 18990.94,-50.64 18960.52,-43.81 18934.6,-37\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"18935.46,-33.6 18924.9,-34.39 18933.65,-40.37 18935.46,-33.6\"/>\n",
       "</g>\n",
       "<!-- (&#39;work&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;Pre&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge131\" class=\"edge\">\n",
       "<title>(&#39;work&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;Pre&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M19589.32,-34.39C19562.64,-42.01 19529.4,-50.21 19498.99,-54 19402.85,-66 19377.11,-66.16 19280.99,-54 19254.62,-50.66 19226.11,-43.93 19201.74,-37.17\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"19202.49,-33.75 19191.92,-34.39 19200.59,-40.48 19202.49,-33.75\"/>\n",
       "</g>\n",
       "<!-- (&#39;&#45;&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node43\" class=\"node\">\n",
       "<title>(&#39;&#45;&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"19389.99\" cy=\"-18\" rx=\"108.58\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"19389.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;&#45;&#39;, &#39;NOUN&#39;) (0.0103)</text>\n",
       "</g>\n",
       "<!-- (&#39;work&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;&#45;&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge132\" class=\"edge\">\n",
       "<title>(&#39;work&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;&#45;&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M19516.04,-18C19513.71,-18 19511.37,-18 19509.04,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"19508.82,-14.5 19498.82,-18 19508.82,-21.5 19508.82,-14.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;follow&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;Pre&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge133\" class=\"edge\">\n",
       "<title>(&#39;follow&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;Pre&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M19000.98,-18C19003.48,-18 19005.98,-18 19008.48,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"19008.75,-21.5 19018.75,-18 19008.75,-14.5 19008.75,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;follow&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;&#45;&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge134\" class=\"edge\">\n",
       "<title>(&#39;follow&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;&#45;&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M18924.9,-34.39C18952.71,-42.01 18987.35,-50.21 19018.99,-54 19126.66,-66.91 19155.58,-68.93 19262.99,-54 19286.71,-50.7 19312.23,-44.1 19334.12,-37.44\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"19335.4,-40.7 19343.9,-34.38 19333.32,-34.02 19335.4,-40.7\"/>\n",
       "</g>\n",
       "<!-- (&#39;process&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"node44\" class=\"node\">\n",
       "<title>(&#39;process&#39;, &#39;VERB&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"18584.99\" cy=\"-18\" rx=\"137.58\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"18584.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;process&#39;, &#39;VERB&#39;) (0.0117)</text>\n",
       "</g>\n",
       "<!-- (&#39;follow&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;process&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge135\" class=\"edge\">\n",
       "<title>(&#39;follow&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;process&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M18740.89,-18C18738.27,-18 18735.66,-18 18733.05,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"18732.96,-14.5 18722.96,-18 18732.96,-21.5 18732.96,-14.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;Pre&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;text&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge138\" class=\"edge\">\n",
       "<title>(&#39;Pre&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;text&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M19090.06,-34.39C19063.77,-42.01 19030.99,-50.2 19000.99,-54 18882.63,-68.97 1940.37,-68.77 1821.99,-54 1795.14,-50.65 1766.09,-43.87 1741.3,-37.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"1742.24,-33.71 1731.66,-34.39 1740.35,-40.45 1742.24,-33.71\"/>\n",
       "</g>\n",
       "<!-- (&#39;Pre&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;&#45;&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge136\" class=\"edge\">\n",
       "<title>(&#39;Pre&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;&#45;&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M19263.54,-18C19266.14,-18 19268.73,-18 19271.32,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"19271.33,-21.5 19281.33,-18 19271.33,-14.5 19271.33,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;Pre&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;process&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge137\" class=\"edge\">\n",
       "<title>(&#39;Pre&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;process&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M19090.06,-34.39C19063.77,-42.01 19030.99,-50.2 19000.99,-54 18886.35,-68.5 18855.8,-67.08 18740.99,-54 18711.35,-50.62 18679.15,-43.75 18651.74,-36.91\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"18652.42,-33.47 18641.87,-34.39 18650.69,-40.26 18652.42,-33.47\"/>\n",
       "</g>\n",
       "<!-- (&#39;&#45;&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;text&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge140\" class=\"edge\">\n",
       "<title>(&#39;&#45;&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;text&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M19343.9,-34.38C19320.08,-42 19290.34,-50.2 19262.99,-54 19143.02,-70.67 1942.18,-69 1821.99,-54 1795.14,-50.65 1766.09,-43.87 1741.3,-37.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"1742.24,-33.71 1731.66,-34.39 1740.35,-40.45 1742.24,-33.71\"/>\n",
       "</g>\n",
       "<!-- (&#39;&#45;&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;process&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge139\" class=\"edge\">\n",
       "<title>(&#39;&#45;&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;process&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M19343.9,-34.38C19320.08,-42 19290.34,-50.2 19262.99,-54 19148.09,-69.97 18856.24,-67.13 18740.99,-54 18711.35,-50.62 18679.15,-43.75 18651.74,-36.91\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"18652.42,-33.47 18641.87,-34.39 18650.69,-40.26 18652.42,-33.47\"/>\n",
       "</g>\n",
       "<!-- (&#39;&#45;&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;remove&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge141\" class=\"edge\">\n",
       "<title>(&#39;&#45;&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;remove&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M19343.9,-34.38C19320.08,-42 19290.34,-50.2 19262.99,-54 19083.38,-78.96 17811.14,-74.65 17630.99,-54 17601.53,-50.62 17569.53,-43.75 17542.3,-36.91\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"17543.05,-33.49 17532.5,-34.39 17541.31,-40.27 17543.05,-33.49\"/>\n",
       "</g>\n",
       "<!-- (&#39;process&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;text&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge142\" class=\"edge\">\n",
       "<title>(&#39;process&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;text&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M18528.12,-34.49C18499.04,-42.08 18462.93,-50.23 18429.99,-54 18315.41,-67.13 1936.44,-68.28 1821.99,-54 1795.14,-50.65 1766.09,-43.87 1741.3,-37.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"1742.24,-33.71 1731.66,-34.39 1740.35,-40.45 1742.24,-33.71\"/>\n",
       "</g>\n",
       "<!-- (&#39;process&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;remove&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge143\" class=\"edge\">\n",
       "<title>(&#39;process&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;remove&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M18528.12,-34.49C18499.04,-42.08 18462.93,-50.23 18429.99,-54 18253.59,-74.22 17807.39,-74.22 17630.99,-54 17601.53,-50.62 17569.53,-43.75 17542.3,-36.91\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"17543.05,-33.49 17532.5,-34.39 17541.31,-40.27 17543.05,-33.49\"/>\n",
       "</g>\n",
       "<!-- (&#39;process&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;stop&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge144\" class=\"edge\">\n",
       "<title>(&#39;process&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;stop&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M18528.12,-34.49C18499.04,-42.08 18462.93,-50.23 18429.99,-54 18311.43,-67.59 18011.38,-68.98 17892.99,-54 17866.62,-50.66 17838.11,-43.93 17813.74,-37.17\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"17814.49,-33.75 17803.92,-34.39 17812.59,-40.48 17814.49,-33.75\"/>\n",
       "</g>\n",
       "<!-- (&#39;remove&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;stop&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge145\" class=\"edge\">\n",
       "<title>(&#39;remove&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;stop&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M17612.6,-18C17615.24,-18 17617.87,-18 17620.51,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"17620.69,-21.5 17630.69,-18 17620.69,-14.5 17620.69,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;remove&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;stem&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge146\" class=\"edge\">\n",
       "<title>(&#39;remove&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;stem&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M17532.5,-34.39C17561.64,-42.01 17597.92,-50.21 17630.99,-54 17738.73,-66.35 17767.37,-67.34 17874.99,-54 17902.02,-50.65 17931.27,-43.87 17956.24,-37.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"17957.24,-40.44 17965.94,-34.39 17955.37,-33.69 17957.24,-40.44\"/>\n",
       "</g>\n",
       "<!-- (&#39;remain&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"node48\" class=\"node\">\n",
       "<title>(&#39;remain&#39;, &#39;VERB&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"18294.99\" cy=\"-18\" rx=\"134.58\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"18294.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;remain&#39;, &#39;VERB&#39;) (0.0280)</text>\n",
       "</g>\n",
       "<!-- (&#39;remove&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;remain&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge147\" class=\"edge\">\n",
       "<title>(&#39;remove&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;remain&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M17532.5,-34.39C17561.64,-42.01 17597.92,-50.21 17630.99,-54 17744.03,-66.95 18029.98,-67.2 18142.99,-54 18171.65,-50.65 18202.75,-43.87 18229.3,-37.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"18230.45,-40.4 18239.24,-34.49 18228.68,-33.63 18230.45,-40.4\"/>\n",
       "</g>\n",
       "<!-- (&#39;stop&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;stem&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge148\" class=\"edge\">\n",
       "<title>(&#39;stop&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;stem&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M17875.4,-18C17877.86,-18 17880.33,-18 17882.8,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"17882.94,-21.5 17892.94,-18 17882.94,-14.5 17882.94,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;stop&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;remain&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge149\" class=\"edge\">\n",
       "<title>(&#39;stop&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;remain&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M17803.92,-34.39C17830.21,-42.01 17862.99,-50.2 17892.99,-54 18003.22,-67.95 18032.63,-66.89 18142.99,-54 18171.65,-50.65 18202.75,-43.87 18229.3,-37.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"18230.45,-40.4 18239.24,-34.49 18228.68,-33.63 18230.45,-40.4\"/>\n",
       "</g>\n",
       "<!-- (&#39;stem&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;remain&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge150\" class=\"edge\">\n",
       "<title>(&#39;stem&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;remain&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M18142.96,-18C18145.3,-18 18147.63,-18 18149.96,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"18150.19,-21.5 18160.19,-18 18150.19,-14.5 18150.19,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;create&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"node49\" class=\"node\">\n",
       "<title>(&#39;create&#39;, &#39;VERB&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"17189.99\" cy=\"-18\" rx=\"131.08\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"17189.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;create&#39;, &#39;VERB&#39;) (0.0042)</text>\n",
       "</g>\n",
       "<!-- (&#39;create&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;graph&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge151\" class=\"edge\">\n",
       "<title>(&#39;create&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;graph&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M17135.71,-34.39C17107.71,-42.01 17072.83,-50.21 17040.99,-54 16881.75,-72.96 5654.25,-72.72 5494.99,-54 5466.51,-50.65 5435.62,-43.87 5409.24,-37.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"5409.93,-33.64 5399.36,-34.49 5408.15,-40.41 5409.93,-33.64\"/>\n",
       "</g>\n",
       "<!-- (&#39;create&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;vertex&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge152\" class=\"edge\">\n",
       "<title>(&#39;create&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;vertex&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M17135.71,-34.39C17107.71,-42.01 17072.83,-50.21 17040.99,-54 16910.19,-69.58 7687.83,-69.19 7556.99,-54 7528.15,-50.65 7496.85,-43.87 7470.12,-37.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"7470.67,-33.61 7460.11,-34.49 7468.91,-40.39 7470.67,-33.61\"/>\n",
       "</g>\n",
       "<!-- (&#39;create&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;sentence&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge153\" class=\"edge\">\n",
       "<title>(&#39;create&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;sentence&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M17135.71,-34.39C17107.71,-42.01 17072.83,-50.21 17040.99,-54 16914.77,-69.03 8015.51,-66.26 7888.99,-54 7853.17,-50.53 7813.97,-43.34 7780.99,-36.29\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"7781.48,-32.82 7770.96,-34.12 7779.99,-39.66 7781.48,-32.82\"/>\n",
       "</g>\n",
       "<!-- (&#39;vertex&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;sentence&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge154\" class=\"edge\">\n",
       "<title>(&#39;vertex&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;sentence&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M7540.09,-18C7542.4,-18 7544.71,-18 7547.02,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"7547.16,-21.5 7557.16,-18 7547.16,-14.5 7547.16,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;sentence&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;sentence&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge157\" class=\"edge\">\n",
       "<title>(&#39;sentence&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;sentence&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M7845.08,-23.68C7860.54,-22.6 7870.53,-20.71 7870.53,-18 7870.53,-15.95 7864.79,-14.36 7855.29,-13.25\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"7855.35,-9.74 7845.08,-12.32 7854.72,-16.71 7855.35,-9.74\"/>\n",
       "</g>\n",
       "<!-- (&#39;other&#39;, &#39;ADJ&#39;) -->\n",
       "<g id=\"node53\" class=\"node\">\n",
       "<title>(&#39;other&#39;, &#39;ADJ&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"8005.99\" cy=\"-18\" rx=\"116.98\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"8005.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;other&#39;, &#39;ADJ&#39;) (0.0172)</text>\n",
       "</g>\n",
       "<!-- (&#39;sentence&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;other&#39;, &#39;ADJ&#39;) -->\n",
       "<g id=\"edge155\" class=\"edge\">\n",
       "<title>(&#39;sentence&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;other&#39;, &#39;ADJ&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M7812.28,-5.61C7843.23,-4.02 7874.19,-4.14 7905.14,-5.97\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"7904.98,-9.47 7915.19,-6.62 7905.44,-2.48 7904.98,-9.47\"/>\n",
       "</g>\n",
       "<!-- (&#39;sentence&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;edge&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge156\" class=\"edge\">\n",
       "<title>(&#39;sentence&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;edge&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M7781.26,-33.5C7813.44,-39.29 7851.39,-45.15 7885.99,-48 7992.3,-56.75 8019.89,-59.01 8125.99,-48 8149.51,-45.56 8174.86,-40.92 8197.58,-36\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"8198.48,-39.39 8207.49,-33.81 8196.97,-32.56 8198.48,-39.39\"/>\n",
       "</g>\n",
       "<!-- (&#39;percentage&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node63\" class=\"node\">\n",
       "<title>(&#39;percentage&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"16028.99\" cy=\"-18\" rx=\"157.87\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"16028.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;percentage&#39;, &#39;NOUN&#39;) (0.0238)</text>\n",
       "</g>\n",
       "<!-- (&#39;sentence&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;percentage&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge158\" class=\"edge\">\n",
       "<title>(&#39;sentence&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;percentage&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M7770.96,-34.12C7805.82,-41.81 7849.46,-50.17 7888.99,-54 8109.18,-75.34 15632.89,-76.28 15852.99,-54 15886.59,-50.6 15923.25,-43.63 15954.38,-36.73\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"15955.29,-40.11 15964.28,-34.49 15953.75,-33.28 15955.29,-40.11\"/>\n",
       "</g>\n",
       "<!-- (&#39;appear&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"node64\" class=\"node\">\n",
       "<title>(&#39;appear&#39;, &#39;VERB&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"16338.99\" cy=\"-18\" rx=\"133.78\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"16338.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;appear&#39;, &#39;VERB&#39;) (0.0431)</text>\n",
       "</g>\n",
       "<!-- (&#39;sentence&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;appear&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge159\" class=\"edge\">\n",
       "<title>(&#39;sentence&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;appear&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M7770.96,-34.12C7805.82,-41.81 7849.46,-50.17 7888.99,-54 8003.7,-65.12 16072.52,-67.37 16186.99,-54 16215.77,-50.64 16247.01,-43.81 16273.63,-37\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"16274.81,-40.31 16283.6,-34.39 16273.04,-33.54 16274.81,-40.31\"/>\n",
       "</g>\n",
       "<!-- (&#39;connect&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"node52\" class=\"node\">\n",
       "<title>(&#39;connect&#39;, &#39;VERB&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"16902.99\" cy=\"-18\" rx=\"137.58\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"16902.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;connect&#39;, &#39;VERB&#39;) (0.0042)</text>\n",
       "</g>\n",
       "<!-- (&#39;connect&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;sentence&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge160\" class=\"edge\">\n",
       "<title>(&#39;connect&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;sentence&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M16846.11,-34.39C16816.78,-42.01 16780.27,-50.21 16746.99,-54 16624.75,-67.92 8011.44,-65.87 7888.99,-54 7853.17,-50.53 7813.97,-43.34 7780.99,-36.29\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"7781.48,-32.82 7770.96,-34.12 7779.99,-39.66 7781.48,-32.82\"/>\n",
       "</g>\n",
       "<!-- (&#39;connect&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;other&#39;, &#39;ADJ&#39;) -->\n",
       "<g id=\"edge161\" class=\"edge\">\n",
       "<title>(&#39;connect&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;other&#39;, &#39;ADJ&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M16846.11,-34.39C16816.78,-42.01 16780.27,-50.21 16746.99,-54 16628.23,-67.53 8259.5,-69.53 8140.99,-54 8115.63,-50.68 8088.26,-43.98 8064.84,-37.26\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"8065.64,-33.85 8055.06,-34.39 8063.67,-40.57 8065.64,-33.85\"/>\n",
       "</g>\n",
       "<!-- (&#39;other&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;sentence&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge162\" class=\"edge\">\n",
       "<title>(&#39;other&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;sentence&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M7915.19,-29.38C7884.24,-31.58 7853.28,-32.07 7822.33,-30.84\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"7822.43,-27.35 7812.28,-30.39 7822.11,-34.34 7822.43,-27.35\"/>\n",
       "</g>\n",
       "<!-- (&#39;other&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;edge&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge163\" class=\"edge\">\n",
       "<title>(&#39;other&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;edge&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M8123.11,-18C8125.59,-18 8128.08,-18 8130.56,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"8130.77,-21.5 8140.77,-18 8130.77,-14.5 8130.77,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;edge&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;sentence&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge165\" class=\"edge\">\n",
       "<title>(&#39;edge&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;sentence&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M8222.05,-34.81C8193.06,-44.29 8154.87,-55.18 8119.99,-60 8019.61,-73.88 7992.71,-71.17 7891.99,-60 7852.26,-55.59 7808.63,-46.07 7773.52,-37.21\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"7773.94,-33.7 7763.38,-34.61 7772.2,-40.48 7773.94,-33.7\"/>\n",
       "</g>\n",
       "<!-- (&#39;edge&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;similar&#39;, &#39;ADJ&#39;) -->\n",
       "<g id=\"edge164\" class=\"edge\">\n",
       "<title>(&#39;edge&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;similar&#39;, &#39;ADJ&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M8397.13,-18C8399.59,-18 8402.04,-18 8404.5,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"8404.59,-21.5 8414.59,-18 8404.59,-14.5 8404.59,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;edge&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;percentage&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge166\" class=\"edge\">\n",
       "<title>(&#39;edge&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;percentage&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M8322.15,-34.39C8349.58,-42.01 8383.76,-50.21 8414.99,-54 8620.09,-78.91 15647.43,-74.81 15852.99,-54 15886.59,-50.6 15923.25,-43.63 15954.38,-36.73\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"15955.29,-40.11 15964.28,-34.49 15953.75,-33.28 15955.29,-40.11\"/>\n",
       "</g>\n",
       "<!-- (&#39;edge&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;appear&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge167\" class=\"edge\">\n",
       "<title>(&#39;edge&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;appear&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M8322.15,-34.39C8349.58,-42.01 8383.76,-50.21 8414.99,-54 8522.15,-67.02 16079.77,-66.52 16186.99,-54 16215.77,-50.64 16247.01,-43.81 16273.63,-37\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"16274.81,-40.31 16283.6,-34.39 16273.04,-33.54 16274.81,-40.31\"/>\n",
       "</g>\n",
       "<!-- (&#39;weight&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;sentence&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge170\" class=\"edge\">\n",
       "<title>(&#39;weight&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;sentence&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M15658.11,-34.39C15628.78,-42.01 15592.27,-50.21 15558.99,-54 15347.3,-78.11 8101.05,-74.55 7888.99,-54 7853.17,-50.53 7813.97,-43.34 7780.99,-36.29\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"7781.48,-32.82 7770.96,-34.12 7779.99,-39.66 7781.48,-32.82\"/>\n",
       "</g>\n",
       "<!-- (&#39;weight&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;edge&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge168\" class=\"edge\">\n",
       "<title>(&#39;weight&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;edge&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M15658.11,-34.39C15628.78,-42.01 15592.27,-50.21 15558.99,-54 15361.82,-76.46 8611.99,-77.93 8414.99,-54 8387.42,-50.65 8357.55,-43.87 8332.06,-37.09\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"8332.72,-33.64 8322.15,-34.39 8330.88,-40.39 8332.72,-33.64\"/>\n",
       "</g>\n",
       "<!-- (&#39;weight&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;similar&#39;, &#39;ADJ&#39;) -->\n",
       "<g id=\"edge169\" class=\"edge\">\n",
       "<title>(&#39;weight&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;similar&#39;, &#39;ADJ&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M15658.11,-34.39C15628.78,-42.01 15592.27,-50.21 15558.99,-54 15369.16,-75.62 8870.57,-77.66 8680.99,-54 8654.14,-50.65 8625.09,-43.87 8600.3,-37.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"8601.24,-33.71 8590.66,-34.39 8599.35,-40.45 8601.24,-33.71\"/>\n",
       "</g>\n",
       "<!-- (&#39;weight&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;percentage&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge171\" class=\"edge\">\n",
       "<title>(&#39;weight&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;percentage&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M15852.98,-18C15855.58,-18 15858.19,-18 15860.8,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"15860.85,-21.5 15870.85,-18 15860.85,-14.5 15860.85,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;similar&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;sentence&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge172\" class=\"edge\">\n",
       "<title>(&#39;similar&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;sentence&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M8487.32,-34.39C8460.64,-42.01 8427.4,-50.21 8396.99,-54 8284.97,-67.98 8001.35,-64.89 7888.99,-54 7853.17,-50.53 7813.97,-43.34 7780.99,-36.29\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"7781.48,-32.82 7770.96,-34.12 7779.99,-39.66 7781.48,-32.82\"/>\n",
       "</g>\n",
       "<!-- (&#39;run&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"node57\" class=\"node\">\n",
       "<title>(&#39;run&#39;, &#39;VERB&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"15440.99\" cy=\"-18\" rx=\"118.08\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"15440.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;run&#39;, &#39;VERB&#39;) (0.0042)</text>\n",
       "</g>\n",
       "<!-- (&#39;run&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;algorithm&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge174\" class=\"edge\">\n",
       "<title>(&#39;run&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;algorithm&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M15391.55,-34.39C15366.02,-42 15334.17,-50.2 15304.99,-54 15158.39,-73.07 4808.05,-69.05 4660.99,-54 4627.76,-50.6 4591.51,-43.63 4560.74,-36.73\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"4561.48,-33.31 4550.96,-34.49 4559.93,-40.13 4561.48,-33.31\"/>\n",
       "</g>\n",
       "<!-- (&#39;run&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;graph&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge175\" class=\"edge\">\n",
       "<title>(&#39;run&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;graph&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M15391.55,-34.39C15366.02,-42 15334.17,-50.2 15304.99,-54 15169.88,-71.58 5630.31,-69.91 5494.99,-54 5466.51,-50.65 5435.62,-43.87 5409.24,-37.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"5409.93,-33.64 5399.36,-34.49 5408.15,-40.41 5409.93,-33.64\"/>\n",
       "</g>\n",
       "<!-- (&#39;run&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;PageRank&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge173\" class=\"edge\">\n",
       "<title>(&#39;run&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;PageRank&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M15391.55,-34.39C15366.02,-42 15334.17,-50.2 15304.99,-54 15119.33,-78.16 13806.23,-73.17 13619.99,-54 13587.09,-50.61 13551.22,-43.69 13520.71,-36.82\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"13521.11,-33.32 13510.58,-34.49 13519.55,-40.14 13521.11,-33.32\"/>\n",
       "</g>\n",
       "<!-- (&#39;pick&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"node58\" class=\"node\">\n",
       "<title>(&#39;pick&#39;, &#39;VERB&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"14655.99\" cy=\"-18\" rx=\"120.78\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"14655.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;pick&#39;, &#39;VERB&#39;) (0.0042)</text>\n",
       "</g>\n",
       "<!-- (&#39;pick&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;PageRank&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge178\" class=\"edge\">\n",
       "<title>(&#39;pick&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;PageRank&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M14605.43,-34.39C14579.33,-42.01 14546.79,-50.2 14516.99,-54 14319.25,-79.19 13818.28,-74.41 13619.99,-54 13587.09,-50.61 13551.22,-43.69 13520.71,-36.82\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"13521.11,-33.32 13510.58,-34.49 13519.55,-40.14 13521.11,-33.32\"/>\n",
       "</g>\n",
       "<!-- (&#39;vertices(sentence&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node59\" class=\"node\">\n",
       "<title>(&#39;vertices(sentence&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"14086.99\" cy=\"-18\" rx=\"187.67\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"14086.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;vertices(sentence&#39;, &#39;NOUN&#39;) (0.0055)</text>\n",
       "</g>\n",
       "<!-- (&#39;pick&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;vertices(sentence&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge176\" class=\"edge\">\n",
       "<title>(&#39;pick&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;vertices(sentence&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M14605.43,-34.39C14579.33,-42.01 14546.79,-50.2 14516.99,-54 14418.23,-66.58 14392.17,-62.6 14292.99,-54 14253.32,-50.56 14209.82,-43.46 14173.06,-36.46\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"14173.37,-32.96 14162.88,-34.5 14172.04,-39.83 14173.37,-32.96\"/>\n",
       "</g>\n",
       "<!-- (&#39;high&#39;, &#39;ADJ&#39;) -->\n",
       "<g id=\"node60\" class=\"node\">\n",
       "<title>(&#39;high&#39;, &#39;ADJ&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"14404.99\" cy=\"-18\" rx=\"112.38\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"14404.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;high&#39;, &#39;ADJ&#39;) (0.0070)</text>\n",
       "</g>\n",
       "<!-- (&#39;pick&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;high&#39;, &#39;ADJ&#39;) -->\n",
       "<g id=\"edge177\" class=\"edge\">\n",
       "<title>(&#39;pick&#39;, &#39;VERB&#39;)&#45;&gt;(&#39;high&#39;, &#39;ADJ&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M14535.02,-18C14532.68,-18 14530.34,-18 14528,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"14527.74,-14.5 14517.74,-18 14527.74,-21.5 14527.74,-14.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;vertices(sentence&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;PageRank&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge180\" class=\"edge\">\n",
       "<title>(&#39;vertices(sentence&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;PageRank&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M14011.47,-34.5C13972.93,-42.09 13925.19,-50.24 13881.99,-54 13765.98,-64.11 13735.82,-65.92 13619.99,-54 13587.09,-50.61 13551.22,-43.69 13520.71,-36.82\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"13521.11,-33.32 13510.58,-34.49 13519.55,-40.14 13521.11,-33.32\"/>\n",
       "</g>\n",
       "<!-- (&#39;vertices(sentence&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;high&#39;, &#39;ADJ&#39;) -->\n",
       "<g id=\"edge179\" class=\"edge\">\n",
       "<title>(&#39;vertices(sentence&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;high&#39;, &#39;ADJ&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M14274.87,-18C14277.34,-18 14279.8,-18 14282.27,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"14282.41,-21.5 14292.41,-18 14282.41,-14.5 14282.41,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;vertices(sentence&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;score&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge181\" class=\"edge\">\n",
       "<title>(&#39;vertices(sentence&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;score&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M13899.13,-18C13896.8,-18 13894.47,-18 13892.14,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"13891.91,-14.5 13881.91,-18 13891.91,-21.5 13891.91,-14.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;high&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;PageRank&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge182\" class=\"edge\">\n",
       "<title>(&#39;high&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;PageRank&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M14357.78,-34.39C14333.39,-42 14302.95,-50.2 14274.99,-54 14130.76,-73.6 13764.78,-68.91 13619.99,-54 13587.09,-50.61 13551.22,-43.69 13520.71,-36.82\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"13521.11,-33.32 13510.58,-34.49 13519.55,-40.14 13521.11,-33.32\"/>\n",
       "</g>\n",
       "<!-- (&#39;high&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;score&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge183\" class=\"edge\">\n",
       "<title>(&#39;high&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;score&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M14357.78,-34.39C14333.39,-42 14302.95,-50.2 14274.99,-54 14109.4,-76.5 14064.91,-73.89 13898.99,-54 13871.05,-50.65 13840.77,-43.87 13814.92,-37.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"13815.81,-33.7 13805.24,-34.49 13813.99,-40.46 13815.81,-33.7\"/>\n",
       "</g>\n",
       "<!-- (&#39;original&#39;, &#39;ADJ&#39;) -->\n",
       "<g id=\"node62\" class=\"node\">\n",
       "<title>(&#39;original&#39;, &#39;ADJ&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"16618.99\" cy=\"-18\" rx=\"128.08\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"16618.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;original&#39;, &#39;ADJ&#39;) (0.0042)</text>\n",
       "</g>\n",
       "<!-- (&#39;original&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;TextRank&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge184\" class=\"edge\">\n",
       "<title>(&#39;original&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;TextRank&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M16565.83,-34.39C16538.4,-42.01 16504.22,-50.21 16472.99,-54 16301.07,-74.88 4176.24,-71.93 4003.99,-54 3971.46,-50.61 3936,-43.69 3905.85,-36.82\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"3906.37,-33.35 3895.84,-34.49 3904.79,-40.16 3906.37,-33.35\"/>\n",
       "</g>\n",
       "<!-- (&#39;original&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;edge&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge186\" class=\"edge\">\n",
       "<title>(&#39;original&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;edge&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M16565.83,-34.39C16538.4,-42.01 16504.22,-50.21 16472.99,-54 16361.89,-67.5 8526.09,-67.5 8414.99,-54 8387.42,-50.65 8357.55,-43.87 8332.06,-37.09\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"8332.72,-33.64 8322.15,-34.39 8330.88,-40.39 8332.72,-33.64\"/>\n",
       "</g>\n",
       "<!-- (&#39;original&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;weight&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge185\" class=\"edge\">\n",
       "<title>(&#39;original&#39;, &#39;ADJ&#39;)&#45;&gt;(&#39;weight&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M16565.83,-34.39C16538.4,-42.01 16504.22,-50.21 16472.99,-54 16340.19,-70.13 16003.91,-69.14 15870.99,-54 15841.35,-50.62 15809.15,-43.75 15781.74,-36.91\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"15782.42,-33.47 15771.87,-34.39 15780.69,-40.26 15782.42,-33.47\"/>\n",
       "</g>\n",
       "<!-- (&#39;percentage&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;appear&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge187\" class=\"edge\">\n",
       "<title>(&#39;percentage&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;appear&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M16187.02,-18C16189.61,-18 16192.21,-18 16194.81,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"16194.83,-21.5 16204.83,-18 16194.83,-14.5 16194.83,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;Okapi&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;see&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge190\" class=\"edge\">\n",
       "<title>(&#39;Okapi&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;see&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M11350.49,-34.49C11321.6,-42.08 11285.72,-50.23 11252.99,-54 11125.06,-68.75 9062.69,-70.62 8934.99,-54 8909.45,-50.68 8881.88,-43.98 8858.28,-37.26\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"8859.01,-33.83 8848.43,-34.39 8857.05,-40.55 8859.01,-33.83\"/>\n",
       "</g>\n",
       "<!-- (&#39;Okapi&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;BM25&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge188\" class=\"edge\">\n",
       "<title>(&#39;Okapi&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;BM25&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M11543.58,-18C11546.06,-18 11548.53,-18 11551.01,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"11551.18,-21.5 11561.18,-18 11551.18,-14.5 11551.18,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;Okapi&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;function&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge189\" class=\"edge\">\n",
       "<title>(&#39;Okapi&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;function&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M11463.49,-34.49C11492.37,-42.08 11528.26,-50.23 11560.99,-54 11682.85,-68.05 11715.06,-67.47 11836.99,-54 11867.55,-50.63 11900.79,-43.75 11929.09,-36.91\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"11930.01,-40.28 11938.88,-34.49 11928.33,-33.49 11930.01,-40.28\"/>\n",
       "</g>\n",
       "<!-- (&#39;BM25&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;see&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge192\" class=\"edge\">\n",
       "<title>(&#39;BM25&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;see&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M11642.11,-34.39C11612.78,-42.01 11576.27,-50.21 11542.99,-54 11399.03,-70.4 9078.67,-72.69 8934.99,-54 8909.45,-50.68 8881.88,-43.98 8858.28,-37.26\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"8859.01,-33.83 8848.43,-34.39 8857.05,-40.55 8859.01,-33.83\"/>\n",
       "</g>\n",
       "<!-- (&#39;BM25&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;similar&#39;, &#39;ADJ&#39;) -->\n",
       "<g id=\"edge193\" class=\"edge\">\n",
       "<title>(&#39;BM25&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;similar&#39;, &#39;ADJ&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M11642.11,-34.39C11612.78,-42.01 11576.27,-50.21 11542.99,-54 11385.01,-71.99 8838.77,-73.69 8680.99,-54 8654.14,-50.65 8625.09,-43.87 8600.3,-37.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"8601.24,-33.71 8590.66,-34.39 8599.35,-40.45 8601.24,-33.71\"/>\n",
       "</g>\n",
       "<!-- (&#39;BM25&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;function&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge191\" class=\"edge\">\n",
       "<title>(&#39;BM25&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;function&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M11836.81,-18C11839.24,-18 11841.68,-18 11844.11,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"11844.12,-21.5 11854.12,-18 11844.12,-14.5 11844.12,-21.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;function&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;see&#39;, &#39;VERB&#39;) -->\n",
       "<g id=\"edge194\" class=\"edge\">\n",
       "<title>(&#39;function&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;see&#39;, &#39;VERB&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M11938.88,-34.49C11908.66,-42.08 11871.15,-50.23 11836.99,-54 11676.74,-71.7 9094.86,-74.8 8934.99,-54 8909.45,-50.68 8881.88,-43.98 8858.28,-37.26\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"8859.01,-33.83 8848.43,-34.39 8857.05,-40.55 8859.01,-33.83\"/>\n",
       "</g>\n",
       "<!-- (&#39;function&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;sentence&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge196\" class=\"edge\">\n",
       "<title>(&#39;function&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;sentence&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M11938.88,-34.49C11908.66,-42.08 11871.15,-50.23 11836.99,-54 11618.98,-78.08 8107.3,-75.16 7888.99,-54 7853.17,-50.53 7813.97,-43.34 7780.99,-36.29\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"7781.48,-32.82 7770.96,-34.12 7779.99,-39.66 7781.48,-32.82\"/>\n",
       "</g>\n",
       "<!-- (&#39;function&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;similar&#39;, &#39;ADJ&#39;) -->\n",
       "<g id=\"edge195\" class=\"edge\">\n",
       "<title>(&#39;function&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;similar&#39;, &#39;ADJ&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M11938.88,-34.49C11908.66,-42.08 11871.15,-50.23 11836.99,-54 11662.72,-73.25 8854.97,-75.71 8680.99,-54 8654.14,-50.65 8625.09,-43.87 8600.3,-37.08\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"8601.24,-33.71 8590.66,-34.39 8599.35,-40.45 8601.24,-33.71\"/>\n",
       "</g>\n",
       "<!-- (&#39;improvement&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"node68\" class=\"node\">\n",
       "<title>(&#39;improvement&#39;, &#39;NOUN&#39;)</title>\n",
       "<ellipse fill=\"none\" stroke=\"black\" cx=\"7081.99\" cy=\"-18\" rx=\"167.87\" ry=\"18\"/>\n",
       "<text text-anchor=\"middle\" x=\"7081.99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">(&#39;improvement&#39;, &#39;NOUN&#39;) (0.0042)</text>\n",
       "</g>\n",
       "<!-- (&#39;improvement&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;paper&#39;, &#39;NOUN&#39;) -->\n",
       "<g id=\"edge197\" class=\"edge\">\n",
       "<title>(&#39;improvement&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;paper&#39;, &#39;NOUN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M7013.92,-34.5C6979.17,-42.09 6936.07,-50.23 6896.99,-54 6773.34,-65.92 5902.36,-68.5 5778.99,-54 5750.39,-50.64 5719.36,-43.81 5692.91,-37\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"5693.57,-33.55 5683.01,-34.39 5691.79,-40.32 5693.57,-33.55\"/>\n",
       "</g>\n",
       "<!-- (&#39;improvement&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;et&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge199\" class=\"edge\">\n",
       "<title>(&#39;improvement&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;et&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M7013.92,-34.5C6979.17,-42.09 6936.07,-50.23 6896.99,-54 6777.1,-65.56 6474.44,-69.43 6354.99,-54 6329.16,-50.66 6301.25,-43.93 6277.41,-37.17\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"6278.38,-33.81 6267.8,-34.39 6276.43,-40.53 6278.38,-33.81\"/>\n",
       "</g>\n",
       "<!-- (&#39;improvement&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;Barrios&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge198\" class=\"edge\">\n",
       "<title>(&#39;improvement&#39;, &#39;NOUN&#39;)&#45;&gt;(&#39;Barrios&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M6914.28,-18C6911.84,-18 6909.4,-18 6906.96,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"6906.93,-14.5 6896.93,-18 6906.93,-21.5 6906.93,-14.5\"/>\n",
       "</g>\n",
       "<!-- (&#39;Barrios&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;et&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge200\" class=\"edge\">\n",
       "<title>(&#39;Barrios&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;et&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M6693.5,-34.49C6663.1,-42.08 6625.36,-50.23 6590.99,-54 6486.73,-65.45 6459.01,-67.44 6354.99,-54 6329.16,-50.66 6301.25,-43.93 6277.41,-37.17\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"6278.38,-33.81 6267.8,-34.39 6276.43,-40.53 6278.38,-33.81\"/>\n",
       "</g>\n",
       "<!-- (&#39;Barrios&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;al&#39;, &#39;PROPN&#39;) -->\n",
       "<g id=\"edge201\" class=\"edge\">\n",
       "<title>(&#39;Barrios&#39;, &#39;PROPN&#39;)&#45;&gt;(&#39;al&#39;, &#39;PROPN&#39;)</title>\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M6609.06,-18C6606.58,-18 6604.09,-18 6601.61,-18\"/>\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"6601.39,-14.5 6591.39,-18 6601.39,-21.5 6601.39,-14.5\"/>\n",
       "</g>\n",
       "</g>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<graphviz.sources.Source at 0x7f079a951060>"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import graphviz as gv\n",
    "\n",
    "gv.Source.from_file(\"lemma_graph.dot\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cooperative-reproduction",
   "metadata": {},
   "source": [
    "Note that the image which gets rendered in a notebook is probably \"squished\", but other tools can renders these as interesting graphs."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "biological-dependence",
   "metadata": {},
   "source": [
    "## Altair visualisation\n",
    "\n",
    "Let's generate an interactive `altair` plot to look at the lemma graph.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "exact-salmon",
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Requirement already satisfied: altair in /home/ankush/workplace/os_repos/pytextrank/venv/lib/python3.10/site-packages (5.0.1)\n",
      "Requirement already satisfied: numpy in /home/ankush/workplace/os_repos/pytextrank/venv/lib/python3.10/site-packages (from altair) (1.25.2)\n",
      "Requirement already satisfied: jsonschema>=3.0 in /home/ankush/workplace/os_repos/pytextrank/venv/lib/python3.10/site-packages (from altair) (4.19.0)\n",
      "Requirement already satisfied: toolz in /home/ankush/workplace/os_repos/pytextrank/venv/lib/python3.10/site-packages (from altair) (0.12.0)\n",
      "Requirement already satisfied: typing-extensions>=4.0.1 in /home/ankush/workplace/os_repos/pytextrank/venv/lib/python3.10/site-packages (from altair) (4.7.1)\n",
      "Requirement already satisfied: pandas>=0.18 in /home/ankush/workplace/os_repos/pytextrank/venv/lib/python3.10/site-packages (from altair) (2.0.3)\n",
      "Requirement already satisfied: jinja2 in /home/ankush/workplace/os_repos/pytextrank/venv/lib/python3.10/site-packages (from altair) (3.1.2)\n",
      "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /home/ankush/workplace/os_repos/pytextrank/venv/lib/python3.10/site-packages (from jsonschema>=3.0->altair) (2023.7.1)\n",
      "Requirement already satisfied: referencing>=0.28.4 in /home/ankush/workplace/os_repos/pytextrank/venv/lib/python3.10/site-packages (from jsonschema>=3.0->altair) (0.30.2)\n",
      "Requirement already satisfied: attrs>=22.2.0 in /home/ankush/workplace/os_repos/pytextrank/venv/lib/python3.10/site-packages (from jsonschema>=3.0->altair) (23.1.0)\n",
      "Requirement already satisfied: rpds-py>=0.7.1 in /home/ankush/workplace/os_repos/pytextrank/venv/lib/python3.10/site-packages (from jsonschema>=3.0->altair) (0.9.2)\n",
      "Requirement already satisfied: pytz>=2020.1 in /home/ankush/workplace/os_repos/pytextrank/venv/lib/python3.10/site-packages (from pandas>=0.18->altair) (2023.3)\n",
      "Requirement already satisfied: tzdata>=2022.1 in /home/ankush/workplace/os_repos/pytextrank/venv/lib/python3.10/site-packages (from pandas>=0.18->altair) (2023.3)\n",
      "Requirement already satisfied: python-dateutil>=2.8.2 in /home/ankush/workplace/os_repos/pytextrank/venv/lib/python3.10/site-packages (from pandas>=0.18->altair) (2.8.2)\n",
      "Requirement already satisfied: MarkupSafe>=2.0 in /home/ankush/workplace/os_repos/pytextrank/venv/lib/python3.10/site-packages (from jinja2->altair) (2.1.3)\n",
      "Requirement already satisfied: six>=1.5 in /home/ankush/workplace/os_repos/pytextrank/venv/lib/python3.10/site-packages (from python-dateutil>=2.8.2->pandas>=0.18->altair) (1.16.0)\n",
      "\n",
      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip available: \u001b[0m\u001b[31;49m22.3.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m23.2.1\u001b[0m\n",
      "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n"
     ]
    }
   ],
   "source": [
    "!pip install \"altair\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "located-international",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "<style>\n",
       "  #altair-viz-fd3323326ed4463e8623cd34817d680c.vega-embed {\n",
       "    width: 100%;\n",
       "    display: flex;\n",
       "  }\n",
       "\n",
       "  #altair-viz-fd3323326ed4463e8623cd34817d680c.vega-embed details,\n",
       "  #altair-viz-fd3323326ed4463e8623cd34817d680c.vega-embed details summary {\n",
       "    position: relative;\n",
       "  }\n",
       "</style>\n",
       "<div id=\"altair-viz-fd3323326ed4463e8623cd34817d680c\"></div>\n",
       "<script type=\"text/javascript\">\n",
       "  var VEGA_DEBUG = (typeof VEGA_DEBUG == \"undefined\") ? {} : VEGA_DEBUG;\n",
       "  (function(spec, embedOpt){\n",
       "    let outputDiv = document.currentScript.previousElementSibling;\n",
       "    if (outputDiv.id !== \"altair-viz-fd3323326ed4463e8623cd34817d680c\") {\n",
       "      outputDiv = document.getElementById(\"altair-viz-fd3323326ed4463e8623cd34817d680c\");\n",
       "    }\n",
       "    const paths = {\n",
       "      \"vega\": \"https://cdn.jsdelivr.net/npm/vega@5?noext\",\n",
       "      \"vega-lib\": \"https://cdn.jsdelivr.net/npm/vega-lib?noext\",\n",
       "      \"vega-lite\": \"https://cdn.jsdelivr.net/npm/vega-lite@5.8.0?noext\",\n",
       "      \"vega-embed\": \"https://cdn.jsdelivr.net/npm/vega-embed@6?noext\",\n",
       "    };\n",
       "\n",
       "    function maybeLoadScript(lib, version) {\n",
       "      var key = `${lib.replace(\"-\", \"\")}_version`;\n",
       "      return (VEGA_DEBUG[key] == version) ?\n",
       "        Promise.resolve(paths[lib]) :\n",
       "        new Promise(function(resolve, reject) {\n",
       "          var s = document.createElement('script');\n",
       "          document.getElementsByTagName(\"head\")[0].appendChild(s);\n",
       "          s.async = true;\n",
       "          s.onload = () => {\n",
       "            VEGA_DEBUG[key] = version;\n",
       "            return resolve(paths[lib]);\n",
       "          };\n",
       "          s.onerror = () => reject(`Error loading script: ${paths[lib]}`);\n",
       "          s.src = paths[lib];\n",
       "        });\n",
       "    }\n",
       "\n",
       "    function showError(err) {\n",
       "      outputDiv.innerHTML = `<div class=\"error\" style=\"color:red;\">${err}</div>`;\n",
       "      throw err;\n",
       "    }\n",
       "\n",
       "    function displayChart(vegaEmbed) {\n",
       "      vegaEmbed(outputDiv, spec, embedOpt)\n",
       "        .catch(err => showError(`Javascript Error: ${err.message}<br>This usually means there's a typo in your chart specification. See the javascript console for the full traceback.`));\n",
       "    }\n",
       "\n",
       "    if(typeof define === \"function\" && define.amd) {\n",
       "      requirejs.config({paths});\n",
       "      require([\"vega-embed\"], displayChart, err => showError(`Error loading script: ${err.message}`));\n",
       "    } else {\n",
       "      maybeLoadScript(\"vega\", \"5\")\n",
       "        .then(() => maybeLoadScript(\"vega-lite\", \"5.8.0\"))\n",
       "        .then(() => maybeLoadScript(\"vega-embed\", \"6\"))\n",
       "        .catch(showError)\n",
       "        .then(() => displayChart(vegaEmbed));\n",
       "    }\n",
       "  })({\"config\": {\"view\": {\"continuousWidth\": 300, \"continuousHeight\": 300}}, \"data\": {\"name\": \"data-af1f75241d67f8e6eb41b3c597d2754d\"}, \"mark\": {\"type\": \"bar\"}, \"encoding\": {\"color\": {\"field\": \"count\", \"type\": \"quantitative\"}, \"tooltip\": [{\"field\": \"text\", \"type\": \"nominal\"}, {\"field\": \"rank\", \"type\": \"quantitative\"}, {\"field\": \"count\", \"type\": \"quantitative\"}], \"x\": {\"field\": \"index\", \"type\": \"quantitative\"}, \"y\": {\"field\": \"rank\", \"type\": \"quantitative\"}}, \"title\": \"Keyphrase profile of the document\", \"$schema\": \"https://vega.github.io/schema/vega-lite/v5.8.0.json\", \"datasets\": {\"data-af1f75241d67f8e6eb41b3c597d2754d\": [{\"index\": 0, \"text\": \"sentences\", \"count\": 1, \"rank\": 0.14407118792073048}, {\"index\": 1, \"text\": \"INELIGIBLE_PHRASE\", \"count\": 24, \"rank\": 0.12123026637064825}, {\"index\": 2, \"text\": \"Barrios et al\", \"count\": 1, \"rank\": 0.11566772028535821}, {\"index\": 3, \"text\": \"text summarization\", \"count\": 1, \"rank\": 0.09524776232834677}, {\"index\": 4, \"text\": \"ranking webpages\", \"count\": 1, \"rank\": 0.08260919223940909}, {\"index\": 5, \"text\": \"gensim implements\", \"count\": 1, \"rank\": 0.08043607214961235}, {\"index\": 6, \"text\": \"every other sentence\", \"count\": 1, \"rank\": 0.07915141312258998}, {\"index\": 7, \"text\": \"original TextRank\", \"count\": 1, \"rank\": 0.07013026654397199}, {\"index\": 8, \"text\": \"every sentence\", \"count\": 1, \"rank\": 0.06654363130280233}, {\"index\": 9, \"text\": \"the sentences\", \"count\": 1, \"rank\": 0.06654363130280233}, {\"index\": 10, \"text\": \"-\", \"count\": 1, \"rank\": 0.05078719110471754}, {\"index\": 11, \"text\": \"the popular PageRank algorithm\", \"count\": 1, \"rank\": 0.05014935289717139}, {\"index\": 12, \"text\": \"weighted-graphs\", \"count\": 1, \"rank\": 0.0490776014231038}, {\"index\": 13, \"text\": \"vertices\", \"count\": 1, \"rank\": 0.04869052856977416}, {\"index\": 14, \"text\": \"the two sentences\", \"count\": 1, \"rank\": 0.04832294546848499}, {\"index\": 15, \"text\": \"the summarization module\", \"count\": 1, \"rank\": 0.04790153287714053}, {\"index\": 16, \"text\": \"implementations\", \"count\": 1, \"rank\": 0.04764465733587137}, {\"index\": 17, \"text\": \"Pre\", \"count\": 1, \"rank\": 0.04737378445179717}, {\"index\": 18, \"text\": \"the highest PageRank score\", \"count\": 1, \"rank\": 0.04658251039208111}, {\"index\": 19, \"text\": \"an edge\", \"count\": 2, \"rank\": 0.046189920195636586}, {\"index\": 20, \"text\": \"the edge\", \"count\": 1, \"rank\": 0.046189920195636586}, {\"index\": 21, \"text\": \"the PageRank algorithm\", \"count\": 1, \"rank\": 0.04464775208293306}, {\"index\": 22, \"text\": \"his previous post\", \"count\": 1, \"rank\": 0.04326438090881735}, {\"index\": 23, \"text\": \"an unsupervised algorithm\", \"count\": 1, \"rank\": 0.042277900580912416}, {\"index\": 24, \"text\": \"the remaining words\", \"count\": 1, \"rank\": 0.04183918269599732}, {\"index\": 25, \"text\": \"this blog\", \"count\": 1, \"rank\": 0.03843170565737933}, {\"index\": 26, \"text\": \"some popular algorithms\", \"count\": 1, \"rank\": 0.038087584823861424}, {\"index\": 27, \"text\": \"top\", \"count\": 1, \"rank\": 0.03691431910843899}, {\"index\": 28, \"text\": \"the percentage\", \"count\": 1, \"rank\": 0.035644214361701745}, {\"index\": 29, \"text\": \"a graph\", \"count\": 1, \"rank\": 0.03556661207159536}, {\"index\": 30, \"text\": \"the graph\", \"count\": 1, \"rank\": 0.03556661207159536}, {\"index\": 31, \"text\": \"TextRank\", \"count\": 1, \"rank\": 0.03258550335641341}, {\"index\": 32, \"text\": \"the text\", \"count\": 1, \"rank\": 0.03174034167736255}, {\"index\": 33, \"text\": \"a paper\", \"count\": 2, \"rank\": 0.030399026739071213}, {\"index\": 34, \"text\": \"another incubator student\", \"count\": 1, \"rank\": 0.027890118936814874}, {\"index\": 35, \"text\": \"The weight\", \"count\": 1, \"rank\": 0.01951356399645739}, {\"index\": 36, \"text\": \"the weights\", \"count\": 1, \"rank\": 0.01951356399645739}, {\"index\": 37, \"text\": \"the vertices(sentences\", \"count\": 1, \"rank\": 0.017049993659367196}, {\"index\": 38, \"text\": \"an improvement\", \"count\": 1, \"rank\": 0.015050599307603788}, {\"index\": 39, \"text\": \"It\", \"count\": 3, \"rank\": 0.0}, {\"index\": 40, \"text\": \"both\", \"count\": 1, \"rank\": 0.0}, {\"index\": 41, \"text\": \"that\", \"count\": 1, \"rank\": 0.0}, {\"index\": 42, \"text\": \"them\", \"count\": 1, \"rank\": 0.0}, {\"index\": 43, \"text\": \"words\", \"count\": 2, \"rank\": 0.0}]}}, {\"mode\": \"vega-lite\"});\n",
       "</script>"
      ],
      "text/plain": [
       "alt.Chart(...)"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tr = doc._.textrank\n",
    "tr.plot_keyphrases()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "administrative-sleeve",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## Extractive Summarization\n",
    "\n",
    "Again, working with the most recent document above, we'll summarize based on its top `15` phrases, yielding its top `5` sentences..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "afraid-retail",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ic| sent: First, a quick description of some popular algorithms & implementations for text summarization that exist today: the summarization module in gensim implements TextRank, an unsupervised algorithm based on weighted-graphs from a paper by Mihalcea et al.\n",
      "ic| sent: It is an improvement from a paper by Barrios et al.\n",
      "ic| sent: It is built on top of the popular PageRank algorithm that Google used for ranking webpages.\n",
      "ic| sent: Create a graph where vertices are sentences.\n",
      "ic| sent: In original TextRank the weights of an edge between two sentences is the percentage of words appearing in both of them.\n"
     ]
    }
   ],
   "source": [
    "for sent in tr.summary(limit_phrases=15, limit_sentences=5):\n",
    "    ic(sent)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "02cee695-efab-4264-9738-3f5e9f765bfb",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## Using TopicRank\n",
    "\n",
    "The *TopicRank* enhanced algorithm is simple to use in the `spaCy` pipeline and it supports the other features described above:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "7a77525e-9b74-45ba-af71-21aa8f5849f2",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "nlp = spacy.load(\"en_core_web_sm\")\n",
    "nlp.add_pipe(\"topicrank\");"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "sophisticated-crossing",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Let's load an example text:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "judicial-andrews",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\" Chelsea 'opted against' signing Salomon Rondón on deadline day.\\n\\nChelsea reportedly opted against signing Salomón Rondón on deadline day despite their long search for a new centre forward. With Olivier Giroud expected to leave, the Blues targeted Edinson Cavani, Dries Mertens and Moussa Dembele – only to end up with none of them. According to Telegraph Sport, Dalian Yifang offered Rondón to Chelsea only for them to prefer keeping Giroud at the club. Manchester United were also linked with the Venezuela international before agreeing a deal for Shanghai Shenhua striker Odion Ighalo. Manager Frank Lampard made no secret of his transfer window frustration, hinting that to secure top four football he ‘needed’ signings. Their draw against Leicester on Saturday means they have won just four of the last 13 Premier League matches.\""
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "text = pathlib.Path(\"../dat/cfc.txt\").read_text()\n",
    "text"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "96ca4cfe-1dc0-4e81-a2e8-a60ff295bf39",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ic| phrase: Phrase(text='Salomon Rondón',\n",
      "                   chunks=[Salomon Rondón, Salomón Rondón, Rondón],\n",
      "                   count=3,\n",
      "                   rank=0.07866221348202057)\n",
      "ic| phrase: Phrase(text='Chelsea',\n",
      "                   chunks=[Chelsea, Chelsea, Chelsea],\n",
      "                   count=3,\n",
      "                   rank=0.06832817272016853)\n",
      "ic| phrase: Phrase(text='Olivier Giroud',\n",
      "                   chunks=[Olivier Giroud, Giroud],\n",
      "                   count=2,\n",
      "                   rank=0.05574966582168716)\n",
      "ic| phrase: Phrase(text='deadline day',\n",
      "                   chunks=[deadline day, deadline day],\n",
      "                   count=2,\n",
      "                   rank=0.05008120527495589)\n",
      "ic| phrase: Phrase(text='Leicester', chunks=[Leicester], count=1, rank=0.039067778208486274)\n",
      "ic| phrase: Phrase(text='club', chunks=[club], count=1, rank=0.037625206033098234)\n",
      "ic| phrase: Phrase(text='Edinson Cavani',\n",
      "                   chunks=[Edinson Cavani],\n",
      "                   count=1,\n",
      "                   rank=0.03759951959121995)\n",
      "ic| phrase: Phrase(text='draw', chunks=[draw], count=1, rank=0.037353607917351345)\n",
      "ic| phrase: Phrase(text='Manchester United',\n",
      "                   chunks=[Manchester United],\n",
      "                   count=1,\n",
      "                   rank=0.035757812045215435)\n",
      "ic| phrase: Phrase(text='Dalian Yifang',\n",
      "                   chunks=[Dalian Yifang],\n",
      "                   count=1,\n",
      "                   rank=0.03570018233618092)\n"
     ]
    }
   ],
   "source": [
    "doc = nlp(text)\n",
    "\n",
    "for phrase in doc._.phrases[:10]:\n",
    "    ic(phrase)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7865c45a",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## Using Biased TextRank\n",
    "\n",
    "The *Biased TextRank* enhanced algorithm is simple to use in the `spaCy` pipeline and it supports the other features described above:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "d4d2581b",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "nlp = spacy.load(\"en_core_web_sm\")\n",
    "nlp.add_pipe(\"biasedtextrank\");"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "a83d4003",
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ic| phrase: Phrase(text='Leicester',\n",
      "                   chunks=[Leicester, Leicester],\n",
      "                   count=2,\n",
      "                   rank=0.26184834028994514)\n",
      "ic| phrase: Phrase(text='Saturday',\n",
      "                   chunks=[Saturday, Saturday],\n",
      "                   count=2,\n",
      "                   rank=0.13938186779355857)\n",
      "ic| phrase: Phrase(text='the last 13 Premier League matches',\n",
      "                   chunks=[the last 13 Premier League matches],\n",
      "                   count=1,\n",
      "                   rank=0.12502820319236171)\n",
      "ic| phrase: Phrase(text='none', chunks=[none], count=1, rank=1.9498221604845646e-07)\n",
      "ic| phrase: Phrase(text='Moussa Dembele',\n",
      "                   chunks=[Moussa Dembele, Moussa Dembele],\n",
      "                   count=2,\n",
      "                   rank=8.640024414329197e-08)\n",
      "ic| phrase: Phrase(text='Dries Mertens',\n",
      "                   chunks=[Dries Mertens, Dries Mertens],\n",
      "                   count=2,\n",
      "                   rank=5.152284728493906e-08)\n",
      "ic| phrase: Phrase(text='Edinson Cavani',\n",
      "                   chunks=[Edinson Cavani],\n",
      "                   count=1,\n",
      "                   rank=3.076049036231119e-08)\n",
      "ic| phrase: Phrase(text='a new centre',\n",
      "                   chunks=[a new centre],\n",
      "                   count=1,\n",
      "                   rank=2.7737546970070932e-08)\n",
      "ic| phrase: Phrase(text='the Blues targeted Edinson Cavani',\n",
      "                   chunks=[the Blues targeted Edinson Cavani],\n",
      "                   count=1,\n",
      "                   rank=1.9405864014707633e-08)\n",
      "ic| phrase: Phrase(text='deadline day',\n",
      "                   chunks=[deadline day, deadline day],\n",
      "                   count=2,\n",
      "                   rank=1.3752326412669907e-08)\n"
     ]
    }
   ],
   "source": [
    "doc = nlp(text)\n",
    "\n",
    "focus = \"Leicester\"\n",
    "doc._.textrank.change_focus(focus,bias=10.0,  default_bias=0.0)\n",
    "\n",
    "for phrase in doc._.phrases[:10]:\n",
    "    ic(phrase)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bdbbce88",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "The top-ranked phrases from *Biased TextRank* are closely related to the \"focus\" item: `Leicester`"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "82178f5a",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## Using PositionRank\n",
    "\n",
    "The *PositionRank* enhanced algorithm is simple to use in the `spaCy` pipeline and it supports the other features described above:"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "inner-acceptance",
   "metadata": {},
   "source": [
    "## Using PositionRank\n",
    "\n",
    "The *PositionRank* enhanced algorithm is simple to use in the `spaCy` pipeline and it supports the other features described above:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "stock-millennium",
   "metadata": {},
   "outputs": [],
   "source": [
    "nlp = spacy.load(\"en_core_web_sm\")\n",
    "nlp.add_pipe(\"positionrank\");"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "compact-retention",
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ic| phrase: Phrase(text='deadline day',\n",
      "                   chunks=[deadline day, deadline day],\n",
      "                   count=2,\n",
      "                   rank=0.1671249044190727)\n",
      "ic| phrase: Phrase(text='Salomon Rondón',\n",
      "                   chunks=[Salomon Rondón, Salomon Rondón],\n",
      "                   count=2,\n",
      "                   rank=0.14836718147498046)\n",
      "ic| phrase: Phrase(text='Salomón Rondón',\n",
      "                   chunks=[Salomón Rondón, Salomón Rondón],\n",
      "                   count=2,\n",
      "                   rank=0.14169986334846618)\n",
      "ic| phrase: Phrase(text='Chelsea',\n",
      "                   chunks=[Chelsea, Chelsea, Chelsea, Chelsea],\n",
      "                   count=4,\n",
      "                   rank=0.13419811872859874)\n",
      "ic| phrase: Phrase(text='Rondón', chunks=[Rondón], count=1, rank=0.12722264594603172)\n",
      "ic| phrase: Phrase(text='a new centre',\n",
      "                   chunks=[a new centre],\n",
      "                   count=1,\n",
      "                   rank=0.09181159181129885)\n",
      "ic| phrase: Phrase(text='Giroud', chunks=[Giroud, Giroud], count=2, rank=0.0783201596831592)\n",
      "ic| phrase: Phrase(text='Olivier Giroud',\n",
      "                   chunks=[Olivier Giroud, Olivier Giroud],\n",
      "                   count=2,\n",
      "                   rank=0.07805316118093475)\n",
      "ic| phrase: Phrase(text='none', chunks=[none], count=1, rank=0.07503538984105931)\n",
      "ic| phrase: Phrase(text='their long search',\n",
      "                   chunks=[their long search],\n",
      "                   count=1,\n",
      "                   rank=0.07449683199895643)\n"
     ]
    }
   ],
   "source": [
    "doc = nlp(text)\n",
    "\n",
    "for phrase in doc._.phrases[:10]:\n",
    "    ic(phrase)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "super-presentation",
   "metadata": {},
   "source": [
    "The top-ranked phrases from *PositionRank* are closely related to the \"lead\" items: `Chelsea`, `deadline day`, `Salomon Rondón`"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b3bcc627-77c8-45ad-9ba9-90c7e3dc51e1",
   "metadata": {},
   "source": [
    "## Baseline\n",
    "\n",
    "Now let's re-run this pipeline with the baseline *TextRank* algorithm to compare results:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "unique-domestic",
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ic| phrase: Phrase(text='Shanghai Shenhua striker Odion Ighalo',\n",
      "                   chunks=[Shanghai Shenhua striker Odion Ighalo,\n",
      "                           Shanghai Shenhua striker Odion Ighalo],\n",
      "                   count=2,\n",
      "                   rank=0.11863090071749424)\n",
      "ic| phrase: Phrase(text='none', chunks=[none], count=1, rank=0.09802416183300769)\n",
      "ic| phrase: Phrase(text='Moussa Dembele',\n",
      "                   chunks=[Moussa Dembele, Moussa Dembele],\n",
      "                   count=2,\n",
      "                   rank=0.09341044332809736)\n",
      "ic| phrase: Phrase(text='deadline day',\n",
      "                   chunks=[deadline day, deadline day],\n",
      "                   count=2,\n",
      "                   rank=0.09046182507994752)\n",
      "ic| phrase: Phrase(text='Dries Mertens',\n",
      "                   chunks=[Dries Mertens, Dries Mertens],\n",
      "                   count=2,\n",
      "                   rank=0.08919649435994934)\n",
      "ic| phrase: Phrase(text='Edinson Cavani',\n",
      "                   chunks=[Edinson Cavani],\n",
      "                   count=1,\n",
      "                   rank=0.08418633972470349)\n",
      "ic| phrase: Phrase(text='Salomon Rondón',\n",
      "                   chunks=[Salomon Rondón, Salomon Rondón],\n",
      "                   count=2,\n",
      "                   rank=0.08228367707127111)\n",
      "ic| phrase: Phrase(text='Salomón Rondón',\n",
      "                   chunks=[Salomón Rondón, Salomón Rondón],\n",
      "                   count=2,\n",
      "                   rank=0.08228367707127111)\n",
      "ic| phrase: Phrase(text='Rondón', chunks=[Rondón], count=1, rank=0.0750732870664833)\n",
      "ic| phrase: Phrase(text='Dalian Yifang',\n",
      "                   chunks=[Dalian Yifang, Dalian Yifang],\n",
      "                   count=2,\n",
      "                   rank=0.06681675615287698)\n"
     ]
    }
   ],
   "source": [
    "nlp = spacy.load(\"en_core_web_sm\")\n",
    "nlp.add_pipe(\"textrank\")\n",
    "doc = nlp(text)\n",
    "\n",
    "for phrase in doc._.phrases[:10]:\n",
    "    ic(phrase)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "overhead-celebration",
   "metadata": {},
   "source": [
    "The baseline algorithm is picking up named entities, although not emphasizing the order in which these entities were introduced in the text."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
